Annotations
Annotation Package Source
@Resource javax.annotation Java
@Inject javax.inject Java
@Qualifier javax.inject Java
@Autowired org.springframework.bean.factory Spring
@Autowied
是通过ByType注入的,可以在field.contractor注入,如果是有两个以及以上相同的类型或者没有就会报错,但是@Qualifier配合使用可以制定bean的名称也就是把自动装配类型从By-type 变成By-name 当然 @Autowied有一个属性为Required 当值为false时
@Autowired(required=false)
private HelloChina helloChina;
当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired (required = false ),这等于告诉 Spring:在找不到匹配 Bean 时也不报错
----------------------------------------------------------
@Inject Annotation based on JSR-330
该注解几乎可以完全替代Spring的@Autowired注解。所以除了使用Spring特定的@Autowired注解,我们可以选择@Inject。
和@Autowired一个,@Inject可以用来自动装配属性、方法和构造器;与@Autowired不同的是,@Inject没有required属性。因此@Inject注解注入的依赖关系必须存在,否则报异常。
与@Autowired一样,@Inject有自己限定的方法,即处理限定歧义性的依赖,配置如下:
@Inject
@Named("xxName")
private HelloChina helloChina;
如上所示,@Qualifier注解尝试注入ID为xxName的Bean。
原理,也即是将byType自动装配转换为byName自动装配。
-------------------------
@Resource
默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象.
注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称装配了