@Autowired和@Resource到底有什么区别
@Autowired是Spring框架中的注解,@Resource是Java中定义的注解来自于JSR-250规范提案。
两者依赖查找顺序不同,@Autowired是先根据类型找再根据名称找依赖,@Resource是现根据名称找依赖,如果找不到再根据类型找。@Autowired只有一个参数可用(required默认是true,即依赖必须存在,否则报错)。@Resource支持七个参数,主要可以选择注入的依赖的名称。
@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入。
@Qualifier注解的使用,@Qualifier用来修饰一般使用在项目中使用@Qualifier来限定注入的Bean,起到过滤作用。一种是直接修饰属性、构造方法或者Setter注入,Qualifier可以加名称参数指定选择哪个bean,或者在bean上也加@Qualifier来修饰,这样就有了呼应关系;另外一个用法是用来修饰注解,这样相当于将@Qualifier的效果传递到自定义注解上。
例子
public class Test { @Autowired @Qualifier("nextYear") public LocalDateTime list; } @Bean @Qualifier public LocalDateTime curDate(){ return LocalDateTime.now(); } @Bean public LocalDateTime nextYear(){ return LocalDateTime.now().plusYears(1); }
这里因为Test中list依赖被@Qualifier修饰,而且@Qualifier参数指定了名称那么此时list只注入nextYear(),如果@Qualifier不指定参数则注入curDate,如果不用@Qualifier修饰则会报错提醒存在两个相同类型bean。

不使用@Qualifier的情况下,而且存在多个同类型bean状况下,如果注入的依赖名称与任意一个Bean的名称都不同那么使用@Resource也会报错,除非名称和其中一个bean一致或者同类型仅有唯一一个bean这样@Autowired和@Resource才会找到最终依赖并注入。使用@Primary注解来修饰Bean可以指定一个默认优先的Bean进行优先注入,这样前面的问题可以避免掉。

浙公网安备 33010602011771号