你不知道的注入注解 Inject

說到注入注解,我們平時(shí)使用最多的應(yīng)該是 Autowired Resource 等,今天無意中看到 Inject 這個(gè)注解,出于好奇,了解一下。

1. 起源

Inject Java EE 6 規(guī)范 JSR 330 – Dependency Injection for Java 中的東西,也就是 Java EE 的依賴注入。在 Google的輕量級(jí)IOC框架 Inject 中被廣泛應(yīng)用,spring 中也有涉及,只是篇幅不多

/**
     * Create a new AutowiredAnnotationBeanPostProcessor
     * for Spring's standard {@link Autowired} annotation.
     * <p>Also supports JSR-330's {@link javax.inject.Inject} annotation, if available.
     */
    @SuppressWarnings("unchecked")
    public AutowiredAnnotationBeanPostProcessor() {
        this.autowiredAnnotationTypes.add(Autowired.class);
        this.autowiredAnnotationTypes.add(Value.class);
        try {
            this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
                    ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
            logger.info("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
        }
        catch (ClassNotFoundException ex) {
            // JSR-330 API not available - simply skip.
        }
    }

jdk 官方對(duì)于 Inject的介紹: https://docs.oracle.com/javaee/6/api/javax/inject/Inject.html

2. 與Autowired、Resource 的區(qū)別

Annotation Package Source
@Resource javax.annotation Java JSR-250
@Inject javax.inject Java JSR-330
@Autowired org.springframework.beans.factory.annotation Spring 2.5+

JSR是Java Specification Requests的縮寫,意思是Java 規(guī)范提案。是指向JCP(Java Community Process)提出新增一個(gè)標(biāo)準(zhǔn)化技術(shù)規(guī)范的正式請(qǐng)求。任何人都可以提交JSR,以向Java平臺(tái)增添新的API和服務(wù)。JSR已成為Java界的一個(gè)重要標(biāo)準(zhǔn)。

@Resource

有兩個(gè)關(guān)鍵的屬性:name-名稱,type-類型

1、如果指定了name,type,則從Spring容器中找一個(gè)名稱和類型相當(dāng)應(yīng)的一個(gè)bean,找不到則報(bào)錯(cuò)。

2、如果只指定了name,則從Spring容器中找一個(gè)名稱和name一樣的bean,找不到則報(bào)錯(cuò)。

3、如果只指定了type,則從Spring容器中找一個(gè)類型和type一樣的bean,找不到或者找到多個(gè)則報(bào)錯(cuò)。

4、如果沒有指定參數(shù),則默認(rèn)找字段名稱裝配,找不到則按類型裝配,找不到則報(bào)錯(cuò)。

@Autowired

默認(rèn)按類型裝配,找不到或者找到多個(gè)則報(bào)錯(cuò)。

如果要按名稱裝配,需要結(jié)合Spring另外一個(gè)注解Qualifier("name")使用。

默認(rèn)必須裝配requred=true,如果可以為空,可以設(shè)置為false,在Spring4+結(jié)合jdk8+的情況下還可以使用Optional和false同等的效果,如下:

@Autowired
public void setDataSource(@Qualifier("mysqlDataSource") DataSource dataSource);

@Inject

與@Autowired類似,可以完全代替@Autowired,但這個(gè)沒有required屬性,要求bean必須存在。

如果要按名稱裝配,需要結(jié)合javax另外一個(gè)注解Named使用

延伸閱讀

Google Guice 一個(gè)輕量級(jí)的依賴注入框架

參考

annotation之@Autowired、@Inject、@Resource三者區(qū)別

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容