說到注入注解,我們平時(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í)的依賴注入框架
參考