spring属性注入和对象注入,spring bean对象的属性注入方式
目录
一、@自动连线注解@限定符@主二、@资源注解三、@注射和@已命名注解总结当一个类运行需要调用一个成员对象,成员对象也是被容器类托管的类对象时,则可以用依赖注入创建成员对象。让容器类来帮你创建成员对象。
官网链接:基于批注的容器配置
前置:
容器类应用配置
导入org。spring框架。语境。注释。组件可以;导入org。spring框架。语境。注释。配置;@ Configuration @ ComponentScanpublic类AppConfig {}创建一个接口喂
公共接口Hello { void Hello world();}创建一个类HelloImpl1实现接口你好。并且被容器托管
导入org。spring框架。刻板印象。组件;@Componentpublic类HelloImpl1实现Hello { @ Override public void Hello world(){ system。出去。println( Hello world 1 );}}
一、@Autowired注解
在声明成员变量上加上@Autowires注解。让容器来帮忙创建对象。该成员变量也必须被容器类托管。
创建我的你好类,里面有喂成员对象。如下所示:
导入org。spring框架。豆子。工厂。注释。自动连线;导入org。spring框架。刻板印象。组件;@组件公共类my Hello { @ Autowired Hello h;void say(){ h . hello world();}}如果不加@自动连线运行说()会报错。
进行测试:
导入org。spring框架。语境。应用程序上下文;导入组织。spring框架。语境。注释。annotationconfigapplicationcontext;公共类Test { public static void main(String[]args){ application context AC=new AnnotationConfigApplicationContext(appconfig。类);MyHello mh=ac.getBean(myHello ,我的Hello。类);MH。say();} }运行结果:
如果成员对象是接口,并且有多个实现类。则需要使用@限定符或者@主要注解。
在创建一个类实现喂接口。
导入org。spring框架。刻板印象。组件;@Componentpublic类HelloImol2实现Hello { @ Override public void Hello world(){ system。出去。println( Hello world 2 );}}这时,你好接口有两个实现类。
再次运行试验类,报错。因为调用类有冲突。
解决方案有两种。
@Qualifier
在@自动连线下加入@限定符(值=id名)。编号名默认是类名且首字母小写。要指定是调用实现接口中的哪个类。
如上述解决:
导入org。spring框架。豆子。工厂。注释。自动连线;导入org。spring框架。豆子。工厂。注释。限定符;导入org。spring框架。刻板印象。组件;@ component公共类my hello { @ auto wired @ Qualifier(value= hello impl 1 )//添加此注解你好h;void say(){ h . hello world();}}
@Primary
在想要用到的多个实现接口对象中的其中一个类,加上@主要注解
如: 我想通过喂运行你好。则在实现类加上@主要注解:
导入org。spring框架。语境。注释。初级;导入org。spring框架。刻板印象。组件;@ Component @ primary public class Hello impl 1实现Hello { @ Override public void Hello world(){ system。出去。println( Hello world 1 );} }测试类运行成功
二、@Resource注解
在成员对象上加入@Resource(name=id名)id名为你想要调用这个接口中实现的哪个类的类名且首字母小写。
则上述的我的你好类可写成:
导入org。spring框架。刻板印象。组件;导入javax。注释。资源;@ component公共类my Hello { @ Resource(name= Hello impl 1 )Hello h;void say(){ h . hello world();} }运行Test类
三、@Inject 和 @Named注解
使用这两个注解需要导入坐标。在pom.xml加入
依赖关系groupIdjavax.inject/groupId artifactIdjavax.inject/artifactId版本1/版本/依赖关系在需要创建的成员对象上一起使用了两个注释。其中@Named(id name) id name是您要在此接口中调用的类的类名,首字母是小写的。
则上述的MyHello类可以修改为:
导入org . spring framework . stereotype.component;导入javax . inject . inject;导入javax . inject . named;@ component public class my Hello { @ Inject @ Named( Hello impl 1 )Hello h;void say(){ h . hello world();}}继续运行测试类,仍然可以成功运行。
上面也可以实现set方法的依赖注入,需要保证传递的参数由容器管理。
总结
本文到此为止。希望它能帮到你,也希望你能多关注更多的盛行它的内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。