5.6.4 @Autowired注解
自Spring诞生以来,<bean/>的autowire和dependency-check属性便一直存在。当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required。同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下。
@Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。比如,位于autowiringdemo项目中的TestBean1类的testBean2和testBean3属性应用了这一注解,具体如下。
为启用这一注解,AutowiredAnnotationBeanPostProcessor必须定义在XML配置文件中,示例如下,摘自autowired.xml。运行时,testBean2和testBean3受管Bean会自动注入到testBean1中。开发者是否注意到@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为。
下面给出了应用于设值方法的@Autowired注解。
下面给出了应用于构建器的@Autowired注解。
下面给出了应用于普通方法的@Autowired注解。
除了能够自动注入普通受管Bean外,@Autowired注解还能够注入一些特殊对象,比如受管Bean所在DI容器中的各种元数据对象,示例如下。@Autowired将当前DI容器注入。
在@Autowired的required属性与@Required注解间进行取舍
@Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。
5.6.5 细粒度控制Autowiring策略
当多个协作者满足autowire注入条件时,我们可以启用<bean/>元素的primary属性,从而避免异常的抛出。但是,primary属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管Bean的时候。
下面给出了某XML配置示例。
现在希望将它们分别注入到下面给出的属性中。显然,启用primary属性是不行的,因为一旦启用它,testBean2a、testBean2b、testBean2c将引用到同一受管Bean中。
为此,我们需要启用<qualifier/>元素及@Qualifier注解。调整后的XML配置示例如下。
相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个@Qualifier注解分别指定了待注入的受管Bean,比如"2a"表示要注入<qualifier/>的value属性取值为"2a"的目标受管Bean。
@Qualifier注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。
开发者还可以基于@Qualifier注解构建更复杂的Autowiring策略,下面给出了一注解示例。
同使用@Qualifier注解一样,下面给出了@FineQualifier应用示例。
为配合@FineQualifier注解的使用,XML配置文件也需要作相应的调整,下面给出了调整后的配置示例。
或者,开发者也可以启用<meta/>元素,配置示例如下。当在同一受管Bean中同时指定<qualifier/>和<meta/>元素时,DI容器会优先使用<qualifier/>。
当@FineQualifier注解没有应用类一级的@Qualifier注解时,开发者必须借助如下对象注册它。
自Spring诞生以来,<bean/>的autowire和dependency-check属性便一直存在。当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required。同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD}) public @interface Autowired { //是否必须满足依赖性检查 boolean required() default true; }
@Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。比如,位于autowiringdemo项目中的TestBean1类的testBean2和testBean3属性应用了这一注解,具体如下。
@Autowired(required=false) private TestBean2 testBean2; @Autowired private TestBean3 testBean3;
为启用这一注解,AutowiredAnnotationBeanPostProcessor必须定义在XML配置文件中,示例如下,摘自autowired.xml。运行时,testBean2和testBean3受管Bean会自动注入到testBean1中。开发者是否注意到@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为。
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <bean id="testBean1" class="test.TestBean1"/> <bean id="testBean2" class="test.TestBean2"/> <bean id="testBean3" class="test.TestBean3"/>
下面给出了应用于设值方法的@Autowired注解。
@Autowired(required=false) public void setTestBean2(TestBean2 testBean2) { this.testBean2 = testBean2; } @Autowired public void setTestBean3(TestBean3 testBean3) { this.testBean3 = testBean3; }
下面给出了应用于构建器的@Autowired注解。
@Autowired(required=false) public TestBean1(TestBean2 tb2, TestBean3 tb3) { this.testBean2 = tb2; this.testBean3 = tb3; }
下面给出了应用于普通方法的@Autowired注解。
@Autowired public void preparedBean(TestBean2 tb2, TestBean3 tb3){ this.testBean2 = tb2; this.testBean3 = tb3; }
除了能够自动注入普通受管Bean外,@Autowired注解还能够注入一些特殊对象,比如受管Bean所在DI容器中的各种元数据对象,示例如下。@Autowired将当前DI容器注入。
@Autowired private ApplicationContext ac;
在@Autowired的required属性与@Required注解间进行取舍
@Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。
5.6.5 细粒度控制Autowiring策略
当多个协作者满足autowire注入条件时,我们可以启用<bean/>元素的primary属性,从而避免异常的抛出。但是,primary属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管Bean的时候。
下面给出了某XML配置示例。
<bean id="testBean2a" class="test.TestBean2"/> <bean id="testBean2b" class="test.TestBean2"/> <bean id="testBean2c" class="test.TestBean2"/>
现在希望将它们分别注入到下面给出的属性中。显然,启用primary属性是不行的,因为一旦启用它,testBean2a、testBean2b、testBean2c将引用到同一受管Bean中。
@Autowired 2.private TestBean2 testBean2a; @Autowired private TestBean2 testBean2b; @Autowired private TestBean2 testBean2c;
为此,我们需要启用<qualifier/>元素及@Qualifier注解。调整后的XML配置示例如下。
<bean id="testBean2a" class="test.TestBean2"> <qualifier value="2a"/> </bean> <bean id="testBean2b" class="test.TestBean2"> <qualifier value="2b"/> </bean> <bean id="testBean2c" class="test.TestBean2"> <qualifier value="2c"/> </bean>
相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个@Qualifier注解分别指定了待注入的受管Bean,比如"2a"表示要注入<qualifier/>的value属性取值为"2a"的目标受管Bean。
@Autowired @Qualifier("2a") private TestBean2 testBean2a; @Autowired @Qualifier("2b") private TestBean2 testBean2b; @Autowired 10.@Qualifier("2c") private TestBean2 testBean2c;
@Qualifier注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。
@Autowired private void preparedBean(@Qualifier("2a") TestBean2 testBean2a, @Qualifier("2b") TestBean2 testBean2b,@Qualifier("2c") TestBean2 testBean2c) { this.testBean2a = testBean2a; this.testBean2b = testBean2b; this.testBean2c = testBean2c; }
开发者还可以基于@Qualifier注解构建更复杂的Autowiring策略,下面给出了一注解示例。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER}) @Qualifier public @interface FineQualifier { String keyFine() default ""; String valueFine() default ""; }
同使用@Qualifier注解一样,下面给出了@FineQualifier应用示例。
@Autowired @FineQualifier(keyFine="key2A", valueFine="value2A") private TestBean2 testBean2a; @Autowired @FineQualifier(keyFine="key2B", valueFine="value2B") private TestBean2 testBean2b; @Autowired 10.@FineQualifier(keyFine="key2C", valueFine="value2C") private TestBean2 testBean2c;
为配合@FineQualifier注解的使用,XML配置文件也需要作相应的调整,下面给出了调整后的配置示例。
<bean id="testBean2a" class="test.TestBean2"> <qualifier type="test.FineQualifier"> <attribute key="keyFine" value="key2A"/> <attribute key="valueFine" value="value2A"/> </qualifier> </bean> <bean id="testBean2b" class="test.TestBean2"> <qualifier type="test.FineQualifier"> <attribute key="keyFine" value="key2B"/> <attribute key="valueFine" value="value2B"/> </qualifier> </bean> <bean id="testBean2c" class="test.TestBean2"> <qualifier type="test.FineQualifier"> <attribute key="keyFine" value="key2C"/> <attribute key="valueFine" value="value2C"/> </qualifier> </bean>
或者,开发者也可以启用<meta/>元素,配置示例如下。当在同一受管Bean中同时指定<qualifier/>和<meta/>元素时,DI容器会优先使用<qualifier/>。
<bean id="testBean2a" class="test.TestBean2"> <meta key="keyFine" value="key2A"/> <meta key="valueFine" value="value2A"/> </bean> <bean id="testBean2b" class="test.TestBean2"> <meta key="keyFine" value="key2B"/> <meta key="valueFine" value="value2B"/> </bean> 10. 11.<bean id="testBean2c" class="test.TestBean2"> <meta key="keyFine" value="key2C"/> <meta key="valueFine" value="value2C"/> </bean>
当@FineQualifier注解没有应用类一级的@Qualifier注解时,开发者必须借助如下对象注册它。
<bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer"> <property name="customQualifierTypes"> <set> <value>test.FineQualifier</value> </set> </property> </bean>
发表评论
-
在Struts2的Action中取得请求参数值的几种方法
2011-08-21 13:12 907在Struts2的Action中取得请求参数值的几种方法 收藏 ... -
下载xwork源码过程
2011-08-21 00:53 2300xwork 官网地址: http://www.opensym ... -
Design Pattern: Read-Write-Lock 模式
2011-07-13 23:08 1635如果有一个资料档有可能同时间会有许多客户端对它进行读取与写入的 ... -
Java:使用synchronized和Lock对象获取对象锁
2011-07-13 22:07 1107在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。 1 ... -
Maven学习笔记(2) ---- 安装与运行Maven
2011-06-08 16:25 11011. 确认JDK的安装 ... -
Maven学习笔记(1) ---- 初探Maven
2011-06-08 16:24 1236(以下一些内容来自Maven- ... -
JProfiler使用(二)
2011-02-22 10:25 2662JProfiler提供的监测内容 ... -
Java虚拟机的选项
2011-02-21 13:28 888Mac OS X的Java虚拟机除了具有标准的HotSpot虚 ... -
java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-02-21 13:26 726引用 1、 PermGen space ... -
JProfiler安装篇
2011-02-21 13:19 14144jprofiler简介 JProfiler是一个全功能的Jav ... -
基于按annotation的hibernate主键生成策略[转载]
2010-10-25 14:04 1447自定义主键生成策略,由@GenericGenerator实现。 ... -
JPA annotation
2010-10-25 14:02 1949事实上,JPA并不是一项技术,而是一种标准,因为JPA只是一套 ... -
汉字转拼音
2010-10-25 13:22 788通过 pinyin4j 实现 public static ... -
java 对汉字通过 拼音进行排序
2010-10-18 11:45 1608Collections.sort(contacts, new ... -
JAVA操作注册表实现开机启动
2010-09-06 11:44 4470import java.awt.FlowLayout; im ...
相关推荐
通过@Bean 和spring的factoryBean注入的bean. 以及对应@service注解注入的类 通过@Autowired 注入对象的时间是现根据类型在根据beanName获取的案例集合
Spring@Autowired注解与自动装配.rar
NULL 博文链接:https://forestqqqq.iteye.com/blog/2235292
Spring Ioc源码分析系列--@Autowired注解的实现原理.doc
主要介绍了使用@Autowired注解警告Field injection is not recommended的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Spring框架中 @Autowired 和 @Resource 注解的区别 在 spring 框架中,除了使用其特有的注解外,使用基于 JSR-250 的注解,它包括 @PostConstruct, @PreDestroy 和 @Resource 注释。 首先,咱们简单了解 @...
下面小编就为大家带来一篇基于Spring@Autowired注解与自动装配详谈。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring注解@Resource和@Autowired.doc
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起...
NULL 博文链接:https://ysj5125094.iteye.com/blog/2054257
主要介绍了Spring注解@Resource和@Autowired区别对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @...
Spring boot @Aspect简介使用场景列子1 (演示基本过程切点表达式切点复合运算切点匹配方法通知注解切面类执行顺序 简介 在 Spring实现 AOP面向切面编程, 是通过 @Aspect注解来实现切面的 使用场景 常见用于记录日志,...
本篇文章主要介绍最重要的三个Spring注解,也就是@Autowired、@Resource和@Service,具有很好的参考价值。下面跟着小编一起来看下吧
3)在CustomerService实现类中添加成员变量,并添加@AutoWired注解让spring自动完成该service的注入。 @Autowired public IAccountService accountService; 4)代码中调用 accountService.getAccount(name)
在这份文档中,我们深入探讨了Spring的核心注解,包括但不限于@Component、@Repository、@Service、@Controller和@Autowired。这些注解简化了配置过程,减少了样板代码,并使得组件之间的耦合度降低,更有利于单元...
背景注解可以减少代码的开发量,Spring 提供了丰富的注解功能。我们可能会被问到,Spring 的注解到底是怎么触发的呢?今天以 Spring 最常使用的一个
注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...