Springbean的几种注入方式都了解吗
spring注入方式可以分为三类,xml注入、注解注入、beandefinition注入;用法上可以分为三种,但是底层实现代码都是统一beanfactory,这三种也有联系xml注入和annotation注入都是依赖beandefinition扩展的接口,注解也是从xml过渡过来的,我们简单的看下这三种的写法。
xml注入
在springboot框架没有出来之前,xml配置被大量的使用,配置过程比较繁琐,但是对代码的侵入性较小,配置和代码分离操作。
实体定义
定义两个属性id,name,并实现get/set方法,重写tostring方法,方便看打印结果。
public class userxml { private string id; private string name; public string getid() { return id; } public void setid(string id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } @override public string tostring() { return "user{" "id='" id '\'' ", name='" name '\'' '}'; } }
xml定义
在resources下新建目录meta-inf下建spring-bean.xml文件,并填充对应的bean配置,bean需要配置id或者name值,ioc容器唯一即可,class配置定义的实体路径,对应的property设置初始化属性。
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="cn.cnzcb.spring.bean.userxml"> <property name="id" value="11"/> <property name="name" value="java圈"/> </bean> </beans>
输出
创建一个beanfactory对象,用classpathxmlapplicationcontext实例化,简单说一下beanfactory作为ioc容器的底层基础,可以说ioc容器就是beanfactory,classpathxmlapplicationcontext是ioc容器的功能扩展;classpathxmlapplicationcontext需要传入资源文件的路径,在通过getbean方法获取具体的实体类,就是结果输出。
//xml注入 beanfactory classpathxmlapplicationcontext = new classpathxmlapplicationcontext("classpath:/meta-inf/spring-bean.xml"); userxml userxml = classpathxmlapplicationcontext.getbean(userxml.class); system.out.println("userxml xml注入对象:" userxml);
注解注入
注解是在spring2.0.3之后才出现的,大量应用也是在springboot的普及下,大家才慢慢接受。其主要好处就是操作简单,通过简单的注解就可以标识成bean组件,而且扩展了各种层次的注解,比如@service、@service、@repository,都是基于@component注解实现派生。
实体定义
实体通xml实体作用类似,这里新建一个类,用去区分不同的bean实现方式。
public class userannotation { private string id; private string name; public string getid() { return id; } public void setid(string id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } @override public string tostring() { return "user{" "id='" id '\'' ", name='" name '\'' '}'; }
注解配置
正常情况下我们是通过标准注解@configuration进行扫描注入,我们这里直接配置类即可,在这个类里面实例化bean组件,并进行初始化操作。
@configuration public class userconfiguration { @bean public userannotation userannotation(){ userannotation userannotation = new userannotation(); userannotation.setid("11"); userannotation.setname("java圈"); return userannotation; } }
输出
annotationconfigapplicationcontext也是beanfactory的一种实现,和classpathxmlapplicationcontext功能类似,只是加载渠道不一样,把定义的配置类注册到ioc容器,调用register方法,这里需要注意,下一步需要调refresh方法就行bean的装载工作,然后通过getbean获取具体的实体,就行输出。
//注解注入 annotationconfigapplicationcontext annotationconfigapplicationcontext = new annotationconfigapplicationcontext(); annotationconfigapplicationcontext.register(userconfiguration.class); annotationconfigapplicationcontext.refresh(); userannotation userannotation = annotationconfigapplicationcontext.getbean(userannotation.class); system.out.println("userannotation注解注入" userannotation);
beandefinition注入
beandefinition是beanfactory的底层实现,包括上面提到的方式,底层也是基于beandefinition实现的,一个bean组件对应一个beandefinition,但是实际操作过程中不会这个用,只是仅供参考。
实体定义
实体通xml实体作用类似,这里新建一个类,用去区分不同的bean实现方式。
public class userbeandefinition { private string id; private string name; public string getid() { return id; } public void setid(string id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } @override public string tostring() { return "user{" "id='" id '\'' ", name='" name '\'' '}'; } }
输出
通过beandefinitionbuilder的genericbeandefinition实例化一个构造器,传入的参数就是实体类,构建之后做初始化操作,之后beandefinition声明调用getbeandefinition方法,通过getpropertyvalues回去bean的具体参数进行结束输出。
//beandefinition注入 beandefinitionbuilder definitionbuilder = beandefinitionbuilder.genericbeandefinition(userbeandefinition.class); definitionbuilder.addpropertyvalue("id", "11"); definitionbuilder.addpropertyvalue("name", "java圈"); beandefinition beandefinition = definitionbuilder.getbeandefinition(); string beanclassname = beandefinition.getbeanclassname(); mutablepropertyvalues mutablepropertyvalues = beandefinition.getpropertyvalues(); string id = mutablepropertyvalues.getpropertyvalue("id").getvalue().tostring(); string name = mutablepropertyvalues.getpropertyvalue("name").getvalue().tostring(); system.out.println("beandefinition注入对象userbeandefition{id=" id ",name=" name "}");
结果输出
输出结果分别是xml注入、annotation注入,beandefinition注入。
userxml xml注入对象:user{id='11', name='java圈'} userannotation注解注入user{id='11', name='java圈'} beandefinition注入对象userbeandefition{id=11,name=java圈}
源代码:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。