Spring IOC 開發中基於註解的配置
1. 定義 Bean
@Component("UserDao")
public class UserDao {
...
}
使用 @Component 註解在類上進行標註,標註後的類可以被 Spring 識別, Spring 容易自動將類轉換為容易管理的 Bean。
除了 @Component 外, spring 還提供了 3 個功能基本與 @Component 等效的特定註解:
-
@Repository:用於對 DAO 實現類進行標註。
-
@Service:用於對 Service 實現類進行標註。
-
@Controller:用於對 Controlle 實現類進行標註。
這 3 個註解作用與 @Component 完全一樣,完全可以用 @Component 替代。
但是,還是推薦使用特定的註解進行標註特定的 Bean,畢竟這樣一眼就能看出 Bean 的真實身份。
2. 自動裝配 Bean
1. 使用 @Autowired 自動注入
Spring 通過 @Autowired 註解實現 Bean 的依賴注入。
@Autowired 可作用於類屬性或方法上。
@Service public class LogonService { // 分別注入 LogDao 和 LogDao 的 Bean @Autowierd private LogDao logDao; @Autowierd private UserDao userDao; ... }
@Autowired 預設按型別(byType)匹配的方式在容器中查詢匹配的 Bean,當有且僅有一個匹配的 Bean 時,Spring 將其注入 @Autowired 標註的變數中。
2. 使用 @Autowired 的 required 屬性
如果容器中沒有一個和標註變數型別匹配的 Bean,那麼 Spring容器啟動時就會丟擲 NoSuchBeanDefinitionException 異常。
如果希望匹配不到時也不要丟擲異常,可以使用 @Autowired(required = false) 進行標註。
@Service public class LogonService { @Autowierd(required = false) private LogDao logDao; ... }
預設情況下,@Autowired 的 required 屬性值為 true。
3. 使用 @Qualifier 指定注入 Bean 的名稱
如果容器擁有一個以上匹配的 Bean 時,則可以通過 @Qualifier 註解限定 Bean 的名稱。
@Service
public class LogonService {
@Autowierd
private LogDao logDao;
// 注入名為 userDao1,型別為 UserDao 的 Bean
@Autowierd
@Qualifier("userDao1")
private UserDao userDao;
...
}
就假設容器有兩個型別為 UserDao 的 Bean,一個名為 userDao1,另一個名為 userDao2,則這裡就會注入名為 userDao1 的 Bean。
4. 對類方法進行標註
@Autowierd 可以對成員變數及方法的引數進行標註。
@Service
public class LogonService {
private LogDao logDao;
private UserDao userDao;
@Autowierd
public void setLogDao(LogDao logDao){
...
}
// 將名為 UserDao 的 Bean 傳給方法引數
@Autowierd
@Qualifier("UserDao")
public void setUserDao(UserDao userDao){
...
}
// @Qualifier 也可以寫在引數前面,給指定的引數進行注入
@Autowierd
public void init(@Qualifier("UserDao")UserDao userDao, LogDao logDao){
...
}
}
雖然 Spring 支援在屬性和方法上標註自動注入註解 @Autowierd,但實際開發中建議採用在方法上標註 @Autowierd 註解,因為這樣更符合面向物件。
5. 懶載入@Lazy
也叫延遲載入,即在 Spring 容器啟動的時候,對於在 Bean 上標註 @Lazy 及 @Autowierd 註解的屬性,不會立即注入屬性值,而是到呼叫此屬性的時候才會注入屬性值。
...
@Lazy //標註懶載入
@Repositoey
public class LogDao{
}
@Service
public calss LogonService implements BeanNameAware{
@Lazy //標註懶載入
@Autowierd
public void setLogDao(LogDao logDao){...}
}
要注意的是 @Lazy 註解必須同時標註在屬性及目標 Bean 上,二者缺一則無效。
@Resource
@Resource 與 @Autowierd 的作用類似,都是提供自動注入的功能。
不同的是,@Resource 是按名稱匹配注入。@Resource 要球提供一個 Bean 名稱的屬性,如果屬性為空,則自動採用標註處的變數名或方法名作為 Bean 的名稱。
public class Boss {
private Car car;
//注入名為 car 的 Bean
@Resource("car")
private void setCar(Car car){
...
}
}
@Resource 是按名稱匹配注入 Bean,@Autowierd 預設按型別匹配注入 Bean。
但是@Resource 的功能沒有 @Autowierd豐富,@Autowierd 和 @Qualifier結合則能代替 @Resource 。