Spring的註解

一、幾個常用的註解

      對Spring的註解標籤剛剛接觸,所以就找了幾個常用的,記錄下,感覺註解用了之後,會在*.xml文件中大大減少配置量。以前我們每個Bean都需到配置文件中配置關聯下。spring2.5後,引入了完整的annotation配置註解,使得我們的程序配置更簡單更容易維護。

        @Component;@Controller;@Service ;@Repository
annotaion配置註解中用@Component來表示一個通用註釋用於說明一個類是一個spring容器管理的類。即就是該類已經拉入到spring的管理中了。而@Controller@Service ,@Repository@Component的細化,這三個註解比@Component帶有更多的語義,它們分別對應了控制層、服務層、持久層的類。

 @Repository標籤是用來給持久層的類定義一個名字,讓Spring根據這個名字關聯到這個類。

例如:
@Repository("userDao")

1 <strong>public class UserDaoImpl  implements UserDao{
2  
3 }</strong>

聲明瞭UserDaoImpl  在Spring容器中叫userDao這個名字。

@Service是用於服務層的IServiceImpl類文件,功能與@Repository類似。


另外標籤:@Autowired 用來注入。

例如:

1 @Autowired
2 private UserDao userDao;

這樣就注入進去了,相當於我們new了個實現類,我們就無需寫setter方法了。


我們還得有配置文件進行配置:

01 <?xml version="1.0" encoding="UTF-8"?>
02 <beans xmlns="http://www.springframework.org/schema/beans"
03        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
04        xmlns:aop="http://www.springframework.org/schema/aop"
05        xmlns:tx="http://www.springframework.org/schema/tx"
06        xmlns:context="http://www.springframework.org/schema/context"
07       xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
08      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
09      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
10      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
11  
12     <context:annotation-config/>
13     <context:component-scan base-package="com.zxr.manager">
14         <context:include-filter type="regex" expression=".*DaoImpl"/>
15         <context:include-filter type="regex" expression=".*ServiceImpl"/>
16     </context:component-scan>
17 </beans>

這樣就把com.zxr.manager包下的所有.*DaoImpl,.*ServiceImpl都註冊關聯到Spring容器中去了。



二、各種註解方式

1.@Autowired註解(不推薦使用,建議使用@Resource)

@Autowired可以對成員變量、方法和構造函數進行標註,來完成自動裝配的工作。@Autowired的標註位置不同,它們都會在Spring在初始化這個bean時,自動裝配這個屬性。要使@Autowired能夠工作,還需要在配置文件中加入以下

1 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>


2. @Qualifier註解

@Autowired是根據類型進行自動裝配的。例如,如果當Spring上下文中存在不止一個UserDao類型的bean時,就會拋出BeanCreationException異常;如果Spring上下文中不存在UserDao類型的bean,也會拋出BeanCreationException異常。我們可以使用@Qualifier配合@Autowired來解決這些問題。如下:

1). 可能存在多個UserDao實例

Java代碼

1 @Autowired
2 @Qualifier("userServiceImpl")
3 public IUserService userService;

或者

1 @Autowired
2 public void setUserDao(@Qualifier("userDao") UserDao userDao) {
3 this.userDao = userDao;
4 }

這樣,Spring會找到id爲userServiceImpl和userDao的bean進行裝配。

2). 可能不存在UserDao實例

Java代碼

1 @Autowired(required = false)
2 public IUserService userService;


3. @Resource註解

JSR-250標準註解,推薦使用它來代替Spring專有的@Autowired註解。@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按byName自動注入罷了。@Resource有兩個屬性是比較重要的,分別是name和type,Spring將 @Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。要使@Autowired能夠工作,還需要在配置文件中加入以下:

1 <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />


@Resource裝配順序:

a.如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常

b.如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常

c.如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常

d.如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配(見2);如果沒有匹配,則回退爲一個原始類型(UserDao)進行匹配,如果匹配則自動裝配;


4. @PostConstruct(JSR-250)註解

在方法上加上註解@PostConstruct,這個方法就會在Bean初始化之後被Spring容器執行(注:Bean初始化包括,實例化Bean,並裝配Bean的屬性(依賴注入))。它的一個典型的應用場景是,當你需要往Bean裏注入一個其父類中定義的屬性,而你又無法複寫父類的屬性或屬性的setter方法時,如:

Java代碼

01 public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
02 private SessionFactory mySessionFacotry;
03 @Resource
04 public void setMySessionFacotry(SessionFactory sessionFacotry)
05 {
06 this.mySessionFacotry = sessionFacotry;
07 }
08 @PostConstruct
09 public void injectSessionFactory()
10 {
11 super.setSessionFactory(mySessionFacotry);
12 }
13 }

這裏通過@PostConstruct,爲UserDaoImpl的父類裏定義的一個sessionFactory私有屬性,注入了我們自己定義的 sessionFactory(父類的setSessionFactory方法爲final,不可複寫),之後我們就可以通過調用 super.getSessionFactory()來訪問該屬性了。


5. @PreDestroy(JSR-250)註解

在方法上加上註解@PreDestroy,這個方法就會在Bean初始化之後被Spring容器執行。其用法同@PostConstruct。和@PostConstruct 區別在於:@PostConstruct註釋的方法將在類實例化後調用,而標註了 @PreDestroy 的方法將在類銷燬之前調用。


6. @Component註解 (不推薦使用)

只需要在對應的類上加上一個@Component註解,就將該類定義爲一個Bean了。Spring還提供了更加細化的註解形式:@Repository、@Service、@Controller,它們分別對應存儲層Bean,業務層Bean,和展示層Bean。目前版本(2.5)中,這些註解與@Component的語義是一樣的,完全通用,在Spring以後的版本中可能會給它們追加更多的語義。所以,我們推薦使用@Repository、@Service、@Controller來替代@Component。


7.@Scope註解

在使用XML定義Bean時,我們可能還需要通過bean的scope屬性來定義一個Bean的作用範圍,我們同樣可以通過@Scope註解來完成這項工作:

Java代碼

1 @Scope("session")
2 @Component()
3 public class UserSessionBean implements Serializable{
4 ... ...
5 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章