1. 程式人生 > >@Autowired、@Resource、@Qualifier的區別

@Autowired、@Resource、@Qualifier的區別

背景:@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;