这是我参与更文挑战的第9天,活动详情查看:更文挑战
注解版自动绑定@Autowired
@Autowired是基于注解的依赖注入的核心注解,它的存在可以让容器知道需要为当前类注入哪些依赖。@Autowired是按照类型匹配进行依赖注入的,它可以标注于类定义的多个位置:属性、构造方法定义、方法定义。
现在,虽然可以随意地在类定义的各种合适的地方标注@Autowired,希望这些被@Autowired标注的依赖能够被注入,但是,仅将@Autowired标注于类定义中并不能让Spring的IoC容器聪明到自己去看看这些注解,然后注入符合条件的依赖对象。
为了给容器中定义的每个bean定义对应的实例注入依赖,可以遍历他们,然后通过反射,检查每个bean定义对应的类上各种可能位置上的@Autowired。如果存在的话,就可以从当前容器管理的对象中获取符合条件的对象,设置给@Autowired所标注的属性域、构造方法或者方法定义。
根据上面的思路,你一定想到了,我们可以提供一个Spring的IoC容器使用的BeanPostProcessor自定义实现,让这个BeanPostProcessor在实例化bean定义的过程中,来检查当前对象是否有@Autowired标注的依赖需要注入。org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor就是Spring提供的用于这一目的的BeanPostProcessor实现。所以,很幸运,我们不能自己去实现它了。
@Qualifier的陪伴
@Autowired是按照类型进行匹配,如果当前@Autowired标注的依赖在容器中只能找到一个实例与之对应的话,那还好。可是,要是能够同时找到两个或者多个同一类型的对象实例,又该怎么办呢?我们自己当然知道应该把具体哪个实例注入给当前对象,可是,IoC容器并不知道,所以,得通过某种方式告诉它。这是,就可以使用@Qualifier对依赖注入的条件做进一步的限定,使得容器不在迷茫。
@Qualifier实际上是byName自动绑定的注解版,既然IoC容器无法自己从多个同一类型的实例中选取我们真正想要的那个,那么我们不妨就使用@Qualifier直接点名要哪个好了。
@Autowired之外的选择
使用JSR250的@Resoure和@PostConstruct以及@PreDestroy对相应类进行标注,同样可以达到依赖注入的目的。
@Resource与@Autowired不同,它遵循的是byName自动绑定形式的行为准则,也就是说,IoC容器将根据@Resource所指定的名称,到容器中查找beanName与之对应的实例,然后将查找到的对象实例注入给@Resource所标注的对象。
@PostConstruct和@PreDestroy不是服务于依赖注入的,他们主要用于标注对象生命周期管理。