Spring —— 註解 [@Resource、@Autowired、@ Inject]

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方法、構造函數上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章