@Autowired、@Resource、@Qualifier的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LGHunter/article/details/84134167

背景:@Autowired、@Resource均能实现bean注入,但是两者的注入方式是不一样的。

1、@Resource - J2EE提供
默认以名称方式注入。
有两个属性是比较重要的:
name: Spring 将 name 的属性值解析为 bean 的名称, 使用 byName 的自动注入策略;
type: Spring 将 type的属性值解析为 bean 的类型,使用 byType 的自动注入策略;
如果既不指定 name 属性又不指定 type 属性,Spring这时通过反射机制使用 byName 自动注入策略。
@Resource 的装配顺序:
如果同时指定了 name 属性和 type 属性,那么 Spring 将从容器中找唯一匹配的 bean 进行装配,找不到则抛出异常;
如果指定了 name 属性值,则从容器中查找名称匹配的 bean 进行装配,找不到则抛出异常;
如果指定了 type 属性值,则从容器中查找类型匹配的唯一的 bean 进行装配,找不到或者找到多个都会抛出异常;
如果都不指定,则会自动按照 byName 方式进行装配, 如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配;

2、@Autowired - Spring
默认以类型方式注入。默认情况下,它要求依赖对象必须存在,如果允许 null 值,可以设置它 required 为false。
若要以名称方式注入,则再加上@Qualifier(“name”) - (如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,否则将抛出异常)。

demo code:

    @Bean(name = "threadPoolTaskExecutor")
    public Executor threadPoolTaskExecutor() {
        return new ThreadPoolExecutor(10, 100,
                120L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000));
    }

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        return new ThreadPoolTaskExecutor();
    }
    @Autowired
    @Qualifier("threadPoolTaskExecutor")
    private Executor executor;

猜你喜欢

转载自blog.csdn.net/LGHunter/article/details/84134167