Spring —— 註解 [@Resource、@Autowired、@Inject]
簡介
傳統的Spring可以通過.xml文件來配置Bean的注入、配置AOP、Transaction等操作,而這樣做卻有一些弊端:
- 如果
“Bean”
過多,那麼.xml就會很龐大,如果按業務或功能分割.xml,就會出現很多.xml。非常不利於維護!
- 如果習慣了這種配置可能並不覺得麻煩,而我是先接觸的註解後瞭解的xml配置方式,
xml需要在.java與.xml之間切換,代碼閱讀起來會比較麻煩和不好理解(有的.xml會通過表達式獲取.properties的配置)
,不利於理解閱讀!
下面我們要介紹的是,通過@註解來把類交由Spring容器進行管理,主要介紹
@Autowired、@Resource、@Inject這三種注入Bean的註解。
註解 | 所屬包 | 源自 |
---|---|---|
@Resource | javax.annotation | Java JSR-250 |
@Inject | javax.inject | Java JSR-330 |
@Autowired | org.springframework.bean.factory | Spring 2.5+ |
JSR
Java Specification Requests【Java規範提案】,意指向JCP【Java Community Process】新增一個標準化技術規範的正式請求。
任何人都可以提交JSR,向Java開源語言添加API和服務。
JSR是Java開源語言中一個重要都標準。
@Resource
J2EE包下
用來裝配“Bean”的,@Resource可以用在聲明類時裝配Bean,也可以用在setter函數上,裝配參數:
// 通過名字注入
@Resource(name = "testDao")
private TestDao testDao;
// 採用set方式注入,這樣可以注入TestDao
@Resource
public void setTestDao(TestDao testDao) {
.....
}
屬性詳解
- name
默認 ""
定義要注入的bean,按名稱注入,如果沒有屬性name,則按照參數名稱向Spring容器查找相同名稱對象。 - lookup
默認 ""
Spring支持JNDI lookup,通過指定lookup屬性值向Spring容器中查詢對應對象。 - type
默認 java.lang.Object.class
必須是Java所屬類型,指定需注入的Bean類型。 - authenticationType
默認 AuthenticationType.CONTAINER
使用Bean的身份驗證類型,默認是(容器),設置允許使用此Bean的類型指定,不允許其它類型使用。 - shareable
默認 true
設置這個Bean是否可以用於別處。 - mappedName
默認 "" - description
默認 ""
Bean描述信息。
必須的依賴
當我們使用註解方式注入屬性時,一定要往項目中導入spring-aop-4.2.5.RELEASE.jar包,不然就會報異常。
@Autowired
所屬spring-beans包下。
較@Resource註解方式更簡單的配置。在調用配置方法前,加載使用註解的類時注入bean,無序將注入的Bean設置爲public。
// 注入testDao對象
@Autowired
private TestDao testDao;
屬性詳解
只有一個屬性。
- required
默認 true
默認是必須的,如果設置爲false,當無法在IoC中找到對應值時,不會報錯,反之則會報錯。
註解解析
啓動Spring IoC時,容器自動裝載一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Resource、@Autowired、@Inject這些註解時,就會在IoC容器自動查找需要的Bean,並裝配給該對象的屬性。
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
@Inject
- @Inject是JSR330 (Dependency Injection for Java)中的規範,需要導入javax.inject.Inject;實現注入。
- @Inject是根據類型進行自動裝配的,如果需要按名稱進行裝配,則需要配合@Named;
- @Inject可以作用在變量、setter方法、構造函數上。