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

基于注解的依赖注入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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值