一、幾個常用的註解
對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 |
} |