說到注入注解焰坪,我們平時使用最多的應(yīng)該是 Autowired
Resource
等绒窑,今天無意中看到 Inject
這個注解末誓,出于好奇颗味,了解一下超陆。
1. 起源
Inject
Java EE 6 規(guī)范 JSR 330 – Dependency Injection for Java 中的東西,也就是 Java EE 的依賴注入浦马。在 Google的輕量級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 官方對于 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)提出新增一個標準化技術(shù)規(guī)范的正式請求磺陡。任何人都可以提交JSR瞧预,以向Java平臺增添新的API和服務(wù)。JSR已成為Java界的一個重要標準仅政。
@Resource
有兩個關(guān)鍵的屬性:name-名稱垢油,type-類型
1、如果指定了name,type圆丹,則從Spring容器中找一個名稱和類型相當應(yīng)的一個bean滩愁,找不到則報錯。
2辫封、如果只指定了name硝枉,則從Spring容器中找一個名稱和name一樣的bean廉丽,找不到則報錯。
3妻味、如果只指定了type正压,則從Spring容器中找一個類型和type一樣的bean,找不到或者找到多個則報錯责球。
4焦履、如果沒有指定參數(shù),則默認找字段名稱裝配雏逾,找不到則按類型裝配嘉裤,找不到則報錯。
@Autowired
默認按類型裝配栖博,找不到或者找到多個則報錯屑宠。
如果要按名稱裝配,需要結(jié)合Spring另外一個注解Qualifier("name")使用仇让。
默認必須裝配requred=true典奉,如果可以為空,可以設(shè)置為false丧叽,在Spring4+結(jié)合jdk8+的情況下還可以使用Optional和false同等的效果卫玖,如下:
@Autowired
public void setDataSource(@Qualifier("mysqlDataSource") DataSource dataSource);
@Inject
與@Autowired類似,可以完全代替@Autowired蠢正,但這個沒有required屬性骇笔,要求bean必須存在省店。
如果要按名稱裝配嚣崭,需要結(jié)合javax另外一個注解Named使用
延伸閱讀
參考