1. 程式人生 > 其它 >Spring IOC 開發中基於註解的配置

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 。