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 977在Struts2的Action中取得请求参数值的几种方法 收藏 ... -
下载xwork源码过程
2011-08-21 00:53 2400xwork 官网地址: http://www.opensym ... -
Design Pattern: Read-Write-Lock 模式
2011-07-13 23:08 1699如果有一个资料档有可能同时间会有许多客户端对它进行读取与写入的 ... -
Java:使用synchronized和Lock对象获取对象锁
2011-07-13 22:07 1176在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。 1 ... -
Maven学习笔记(2) ---- 安装与运行Maven
2011-06-08 16:25 11511. 确认JDK的安装 ... -
Maven学习笔记(1) ---- 初探Maven
2011-06-08 16:24 1287(以下一些内容来自Maven- ... -
JProfiler使用(二)
2011-02-22 10:25 2711JProfiler提供的监测内容 ... -
Java虚拟机的选项
2011-02-21 13:28 933Mac OS X的Java虚拟机除了具有标准的HotSpot虚 ... -
java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-02-21 13:26 770引用 1、 PermGen space ... -
JProfiler安装篇
2011-02-21 13:19 14218jprofiler简介 JProfiler是一个全功能的Jav ... -
基于按annotation的hibernate主键生成策略[转载]
2010-10-25 14:04 1486自定义主键生成策略,由@GenericGenerator实现。 ... -
JPA annotation
2010-10-25 14:02 2027事实上,JPA并不是一项技术,而是一种标准,因为JPA只是一套 ... -
汉字转拼音
2010-10-25 13:22 836通过 pinyin4j 实现 public static ... -
java 对汉字通过 拼音进行排序
2010-10-18 11:45 1673Collections.sort(contacts, new ... -
JAVA操作注册表实现开机启动
2010-09-06 11:44 4529import java.awt.FlowLayout; im ...
相关推荐
`@Autowired`和`@Bean`是两个关键注解,它们在实现DI时起着重要作用。让我们深入探讨这两个注解的工作原理,以及它们在注入bean时的顺序。 `@Autowired`注解由Spring提供,用于自动装配bean的依赖。当我们在字段、...
- **@Autowired注解的可选性**:使用`required`属性控制是否必须注入。默认为`true`,表示必须注入,否则抛出异常;设为`false`则允许不注入。 ```java @Autowired(required = false) private MyService ...
在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...
在Spring框架中,`@Autowired`注解是一个关键特性,用于简化依赖注入的过程。依赖注入是一种设计模式,它允许我们解耦代码,提高模块的可测试性和可维护性。在这个主题中,我们将深入探讨`@Autowired`的工作原理、...
Spring Ioc源码分析系列--@Autowired注解的实现原理 @ Автоwired注解是 Spring Framework 中的一个重要组件,它提供了自动装配的功能,能够将 Bean 之间的依赖关系自动解析和注入。今天,我们将深入探讨 @...
【@Autowired注解详解及其实现原理】 在Spring框架中,`@Autowired`注解是核心的依赖注入(Dependency Injection,DI)工具,它允许开发者自动地将Bean实例注入到需要的地方,无需显式地通过setter方法或构造函数来...
在Spring框架中,`@Autowired`注解是一个关键特性,用于自动装配Bean的依赖。它极大地简化了传统XML配置中的bean依赖注入过程。本笔记将深入探讨如何在Spring 4中利用`@Autowired`注解配置注入关系,以及它与前一篇...
@Autowired 是 Spring 定义的注解,@Resource 是 JSR 250 规范里面定义的注解,而 Spring 对 JSR 250 规范提供了支持。@Autowired 如果需要支持 name 匹配,就需要配合 @Primary 或者 @Qualifier 来实现。 在实际...
在Spring框架中,`@Autowired`注解用于自动装配bean,简化了依赖注入的过程。然而,IDEA在某些情况下会发出“Field injection is not recommended”的警告。这是因为直接在字段上使用`@Autowired`虽然简洁,但并不...
"基于Spring@Autowired注解与自动装配详谈" 在Spring框架中,自动装配是指容器自动将Bean依赖项装配到组件中的一种机制。这种机制可以简化应用程序的配置和开发。Spring提供了多种方式来实现自动装配,其中之一就是...
Spring的核心特性之一是使用注解来简化配置,其中`@Autowired`和`@Qualifier`是两个关键的注解,它们在自动装配Bean时发挥着重要作用。这篇学习Spring笔记将深入探讨这两个注解的用法、原理以及它们在实际开发中的...
Spring 注解@Resource 和@Autowired Spring 框架中提供了两个重要的注解,分别是@Resource 和@Autowired,它们都是用于 bean 的自动装配的。了解这两个注解的区别和使用场景是非常重要的。 首先,@Autowired 是 ...
Spring框架中,使用@Autowired注解可以将依赖项注入到Bean中,但是当我们需要将依赖项注入到抽象父类时,会遇到一些问题。如果我们直接使用@Autowired注解在抽象父类中,可能不会生效,因为抽象父类不能被实例化。...
@Autowired 注解是 Spring 框架中的一个重要特性,它出现在 Spring 2.5 版本中,用于简化依赖注入(Dependency Injection,简称 DI)的过程。DI 是一种设计模式,允许对象之间的依赖关系在运行时自动解决,使得代码...
在Spring框架中,`@Autowired`注解是一个关键的依赖注入(DI)工具,它极大地简化了组件之间的关联。本文将深入探讨`@Autowired`的工作原理以及其在Spring中的实现方式。 首先,`@Autowired`的基本作用是自动装配Bean...
随着Spring的发展,@Autowired注解应运而生,这是Annotation版本的自动装配。它允许开发者在类的字段、方法或构造器上直接声明依赖,大大减少了XML配置的量。例如: ```java @Service public class UserService { ...
Intellij IDEA如何去掉@Autowired 注入警告的方法 在本篇文章中,我们将探讨如何在...去掉@Autowired 注入警告的方法可以使用构造器注入或Setter注入,避免使用Field注入,并使用Lombok提供的注解来简化我们的代码。
在Spring框架中,`@Autowired`和`@Resource`都是用于自动装配Bean的重要注解,它们简化了依赖注入的过程,使得代码更加简洁、易于维护。本文将深入探讨这两个注解的使用、区别以及如何在实际开发中应用它们。 首先...
3. 方法注入:在setter方法或带有`@PostConstruct`注解的方法上使用`@Autowired`。 4. 方法参数注入:在其他业务方法的参数上使用`@Autowired`。 结合`HibernateDaoSupport`和`@Autowired`,我们可以创建更加高效和...
在Java的Spring框架中,`@Autowired`是一个关键的依赖注入(Dependency Injection,简称DI)注解,它允许开发者自动装配Bean的依赖,无需手动设置属性或者调用构造函数。这个注解是Spring框架的核心特性之一,极大地...