@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进行优先注入,这样前面的问题可以避免掉。

 

 

posted @ 2023-05-06 15:15  DreamCatt  阅读(70)  评论(0)    收藏  举报