@Autowired
spring自己定制的一个注入注解,@Autowired默认通过类型来查找,如果匹配到一个则直接注入。根据类型没有找到直接抛出异常,即使你名字有匹配的但是类型不同也是抛出异常。
当通过类型匹配到多个bean之后,在根据你注入声明的名称去匹配,若有名称匹配则注入,如果没有名称匹配上则抛出异常。
@Resource
@Resource是java自己定义的,如果name和type都没有指定,默认按照name匹配,如果匹配到则注入。没有则按照type去匹配,匹配到一个则装配,如果是匹配到多个则又根据名字注入,如果有多个类型匹配,但是名称不匹配则抛出异常。
如果有name和type都找不到则直接抛出异常。
@Qualifier
当有一种类型的bean有多个实例,你又不想使用变量名去匹配那些bean的实例。就可以使用Qualifier去指定需要注入的的对象的bean。
例如:
现在有TestDao有两个实例,一个实例叫oneImpl,另一个叫twoImpl。
//这里使用Autowire注入,一开始按照类型去匹配,匹配到两个,则按照名称去匹配,因为这里使用了Qualifier修饰,所以就按Qualifier中指定的名字去注入,如果没有Qualifier指定名字,则按默认的变量名testDao去匹配。
@Autowire
@Qualifier(“oneImpl”)
private TestDao testDao;
@Primary
当使用@Autowired和Resource注入的时候,有多个bean匹配到了,然后名字又匹配不上。
就可以使用@Primary来解决。
例如:
现在有TestDao有两个实例,一个实例叫oneImpl,另一个叫twoImpl。twoImpl这个实例的类上面加了@Primary注解。
//以下这种情况如果twoImpl没有加@Primary注解是会报错的,因为有两个bean的名称匹配,但是名字又匹配不上,所以spring就不知道该注入哪一个。
现在使用@Primary修饰了twoImpl,表示twoImpl的优先级别较高,因此在类型匹配到多个,名称不能完全定位到具体的哪一个bean实例,这时候@Primary修饰的bean就会被注入。
@Autowire
private TestDao testDao;