@Autowired注解(转)

5.6.4 @Autowired注解

自Spring诞生以来,的autowire和dependency-check属性便一直存在。当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required。同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下。

Java代码 收藏代码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})
public @interface Autowired {

//是否必须满足依赖性检查
boolean required() default true;
}

@Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。比如,位于autowiringdemo项目中的TestBean1类的testBean2和testBean3属性应用了这一注解,具体如下。

Java代码 收藏代码
@Autowired(required=false)
private TestBean2 testBean2;

@Autowired
private TestBean3 testBean3;

为启用这一注解,AutowiredAnnotationBeanPostProcessor必须定义在XML配置文件中,示例如下,摘自autowired.xml。运行时,testBean2和testBean3受管Bean会自动注入到testBean1中。开发者是否注意到@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为。

Java代码 收藏代码

下面给出了应用于设值方法的@Autowired注解。

Java代码 收藏代码
@Autowired(required=false)
public void setTestBean2(TestBean2 testBean2) {
this.testBean2 = testBean2;
}

@Autowired
public void setTestBean3(TestBean3 testBean3) {
this.testBean3 = testBean3;
}

下面给出了应用于构建器的@Autowired注解。

Java代码 收藏代码
@Autowired(required=false)
public TestBean1(TestBean2 tb2, TestBean3 tb3) {
this.testBean2 = tb2;
this.testBean3 = tb3;
}

下面给出了应用于普通方法的@Autowired注解。

Java代码 收藏代码
@Autowired
public void preparedBean(TestBean2 tb2, TestBean3 tb3){
this.testBean2 = tb2;
this.testBean3 = tb3;
}

除了能够自动注入普通受管Bean外,@Autowired注解还能够注入一些特殊对象,比如受管Bean所在DI容器中的各种元数据对象,示例如下。@Autowired将当前DI容器注入。

Java代码 收藏代码
@Autowired
private ApplicationContext ac;

在@Autowired的required属性与@Required注解间进行取舍

@Required是专门用于依赖性检查的注解,而@Autowired注解的required属性也能够用来承担依赖性检查工作。一旦@Required应用到目标设值方法,则DI容器必须成功调用这一设值方法,@Required注解才认为依赖性条件得到满足,否则将抛出异常。相比之下,当我们将@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。

5.6.5 细粒度控制Autowiring策略

当多个协作者满足autowire注入条件时,我们可以启用元素的primary属性,从而避免异常的抛出。但是,primary属性不能够满足企业级应用的复杂需求,比如多个同一类型的不同协作者需要注入到同一受管Bean的时候。

下面给出了某XML配置示例。

Java代码 收藏代码

现在希望将它们分别注入到下面给出的属性中。显然,启用primary属性是不行的,因为一旦启用它,testBean2a、testBean2b、testBean2c将引用到同一受管Bean中。

Java代码 收藏代码
@Autowired 2.private TestBean2 testBean2a;

@Autowired
private TestBean2 testBean2b;

@Autowired
private TestBean2 testBean2c;

为此,我们需要启用元素及@Qualifier注解。调整后的XML配置示例如下。

Java代码 收藏代码

相应地,属性的定义也需要作相应的调整,下面给出了代码示例。各个@Qualifier注解分别指定了待注入的受管Bean,比如"2a"表示要注入的value属性取值为"2a"的目标受管Bean。

Java代码 收藏代码
@Autowired
@Qualifier("2a")
private TestBean2 testBean2a;

@Autowired
@Qualifier("2b")
private TestBean2 testBean2b;

@Autowired [email protected]("2c")
private TestBean2 testBean2c;

@Qualifier注解能够作用于属性、参数、类、其他注解等地方,比如下面给出了参数级的使用示例。

Java代码 收藏代码
@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策略,下面给出了一注解示例。

Java代码 收藏代码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Qualifier
public @interface FineQualifier {

String keyFine() default "";
String valueFine() default "";
}

同使用@Qualifier注解一样,下面给出了@FineQualifier应用示例。

Java代码 收藏代码
@Autowired
@FineQualifier(keyFine="key2A", valueFine="value2A")
private TestBean2 testBean2a;

@Autowired
@FineQualifier(keyFine="key2B", valueFine="value2B")
private TestBean2 testBean2b;

@Autowired [email protected](keyFine="key2C", valueFine="value2C")

private TestBean2 testBean2c;

为配合@FineQualifier注解的使用,XML配置文件也需要作相应的调整,下面给出了调整后的配置示例。

Java代码 收藏代码

或者,开发者也可以启用元素,配置示例如下。当在同一受管Bean中同时指定和元素时,DI容器会优先使用。

Java代码 收藏代码

10. 11.

当@FineQualifier注解没有应用类一级的@Qualifier注解时,开发者必须借助如下对象注册它。

Java代码 收藏代码

test.FineQualifier

时间: 2024-10-21 16:25:28

@Autowired注解(转)的相关文章

Bean装配之@Autowired注解

@Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方式与set方式作用一样:第二种是在set方法上加注解:第三种是在构造器上加注解 测试代码如下: xml配置文件正常即可: 图解:可以在当前类中,声明ApplicationContext的引用,然后可以用@Autowired进行注解,这时候可以在当前类中得到这个容器,并且可以使用这个容器了 图解: 数

Spring中@Autowired注解、@Resource注解的区别(转)

标签: Autowired Resource Spring(3)  Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Reso

Spring5:@Autowired注解、@Resource注解和@Service注解

什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低 2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率 为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java

Spring学习(9)--- @Autowired注解(二)

可以使用@Autowired注解那些众所周知的解析依赖性接口,比如:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher,MessageSource package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.conte

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析

Spring中@Autowired注解与自动装配

1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法.比如:Boss 拥有 Office 和 Car 类型的两个属性:public class Boss { private Car car; private Office office; // 省略 get/setter @Override public String toString() { retu

@Autowired注解

@Autowired注解,默认情况下,如果因为找不到合适的bean将会导致autowiring抛出失败异常,可以通过@Autowired(required=false)的方式避免. @Autowired注解可以用于成员变量.set方法.构造器(一个类中只能有一个构造被注释成@Autowired(required=true)).list集合.map. 新建一个web项目,导入jar包,jar包如图: 一.@Autowired注解用于成员变量.set方法.构造器(一个类中只能有一个构造被注释成@Au

Spring @Autowired注解用在集合上面,可以保持接口的所有实现类

CourseService课程接口有2个子类,HistroyCourseServiceImpl和MathsCourseServiceImpl public interface CourseService { String getCourseName(); void attendCourse(); } package com.junge.spring.demo.service.course.impl; import com.junge.spring.demo.service.course.Cour

@Resource与@Autowired注解的区别

一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我:我研究一下. 在大学,学习J2EE实训时一直使用的是@Resource注解,后来我就养成习惯了.现在对这两个注解做一下解释: @Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配 @Resource(import javax.annotation.