Spring揭秘(八)——基于注解的依赖注入2

来源:互联网 发布:印度进出口数据 编辑:程序博客网 时间:2024/04/30 03:14

基于注解的依赖注入2

从自动绑定(autowire)到@Autowired

@Autowired是基于注解的依赖注入的核心注解,它的存在可以让容器知道需要为当前类注入哪些依赖。
与原有的byType类型的自动绑定方式类似,@Autowired也是按照类型匹配进行绑定的依赖注入的,不过,它要比byType更加灵活,也更加强大。@Autowired可以标注于类定义的多个位置,包括如下:

  • 域(Field)或者说属性(Property)。不管它们声明的访问限制符深private、protected还是public,只要标注了@Autowired,它们所需的依赖注入需求就能得到满足
public class FXNewsProvider {    @Autowired    private IFXNewsListener newsListener;    @Autowired    private IFXNewsPersister newsPeristener;}
  • 构造方法定义
    标注于类的构造方法之上的@Autowired,相当于抢夺了原有自动绑定功能中“constructor“方式的权利,它将根据构造方法参数类型,来决定将什么样的依赖对象注入给当前对象。
  • 方法定义
    @Autowired 不仅可以标注于传统的setter方法上,还可以标注于任意名称的方法上,只要该方法定义了需要被注入的参数。
public class FXNewsProvider {   private IFXNewsListener newsListener;   private IFXNewsPersister newsPersister;   @Autowired   public void setUp(IFXNewsListener newsListener,IFXNewsPersister newsPersister) {       this.newsListener = newsListener;       this.newsPersister = newsPersister;   }}

在使用@Autowired之后,default-autowire或者autowire的职责就转给了@Autowired,所以现在容器中就只剩下了一个个孤伶伶的bean定义:

 <beans>     <bean id="newsProvider" class="...FXNewsProvider"/>     <bean id="djNewsListener" class="...DowJonesNewsListener" />     <bean id="djNewsPersister" class="...DowJonesNewsPersister"> </beans>

看着依赖注入的信息,一半分散在Java原码中,一半依然留在xml配置文件里,你心里一定觉得不爽。我们在下篇中解决这个问题。


现在,虽然可以随意地在类定义的各种合适的地方标注@Autowired,希望这些被@Autowired标注的依赖能够被注入,但是,仅将@Autowired标注于类定义中并不能让Spring的IoC容器聪明到自己去查看这些注解,然后注入符合条件的依赖对象。容器需要某种方式来了解,哪些对象标注了@Autowired,哪些对象可以作为可供选择的依赖对象来注入给需要的对象。
为了给容器中定义的每个bean定义对应的实例注入依赖,可以遍历它们,然后通过反射,检查每个bean定义对应的类上各种可能位置上的@Autowired。
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor就是Spring提供的用于这一目的BeanPostProcessor

@Qualifier的陪伴

@Autowired是按照类型进行匹配,如果当前@Autowired标注的依赖在容器中只能找到一个实例与之对应的话,那还好。可是,要是能够同时找到两个或者多个同一类型的对象实例,又该怎么办呢?我们自己当然知道应该把具体哪个实例注入给当前对象,可是,IoC容器并不知道,所以得通过某种方式告诉它。这时,就可以使用@Qualifier直接点名要哪个好了。

<beans>   <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">   <bean id="newsProvider" class="...FXNewsProvider" />   <bean id="djNewsListener" class="...DowJonesNewsListener" />   <bean id="reutersNewsListener" class="...ReutersNewsListener">   <bean id="djNewsPersister" class="...DowJonesNewsPersister"></beans>
public class FXNewsProvider {    @Autowired    @Qualifier("reutersNewsListener")    private IFXNewsListener newsListener;    @Autowired    private IFXNewsPersister newsPersister;}
0 0
原创粉丝点击