@Resoure | @Autowire | |
---|---|---|
注解来源 | JDK | Spring |
装配方式 | 优先按照名称 | 优先按照类型,通常配合@Qualifier使用 |
可扩展性 | 因为是JDK的,所以可扩展性较强,可以换成另外的框架 | 扩展性较差,只能在spring中使用 |
@Autowire+@Qualifier = @Resource
@Resource默认按名称装配,当找不到与名称匹配的bean时才按照类型进行装配。名称可以通过name属性指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,当注解写在setter方法上时,默认取属性名进行装配。
@Resource装配顺序
- 如果同时指定name和type,则从容器中查找唯一匹配的bean装配,找不到则抛出异常
- 如果指定name属性,则从容器中查找名称匹配的bean装配,找不到则抛出异常
- 如果指定type属性,则从容器中查找类型唯一匹配的bean装配,找不到或者找到多个抛出异常
- 如果都不指定,则自动按照byName方式装配,如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配
- @AutoWired
- AutoWired注解,先按照类型查找。
- 如果找到了一个匹配类型的就注入,如果没有找到就报错
- 如果找到两个及以上,就按照变量值查找,如果找到了,就注入,没有找到就报错,这个时候,可以配合使用@ Qualifier进行注入。
现在有如下的类
接口Car:
package cn;
import org.springframework.stereotype.Component;
@Component
public interface Car {
}
接口Car的两个实现类
package cn;
import org.springframework.stereotype.Component;
@Component
public class BigCar implements Car {
}
package cn;
import org.springframework.stereotype.Component;
@Component
public class SmallCar implements Car {
}
Person类
package cn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Person{
@Autowired
private Car car;
public Car getCar() {
return car;
}
}
在Person中包含了Car,如果这个时候同时将Car的两个实现类,都放到容器中,注入会出现错误。
NoUniqueBeanDefinitionException: No qualifying bean of type ‘cn.Car’ available: expected single matching bean but found 2: bigCar,smallCar。如果将其中的Car car;改变成为Car bigCar,或者smallCar,会注入成功。
也就是说当在容器中找到多个类型一样的类的时候,这个时候autowired会按照变量值来查找。
@Autowired也可以配合@Qualifier来使用,查找变量