舉例:di-annotation 項目
對于 DI 使用注解,將不再需要在 Spring 配置文件中聲明 bean 實例。Spring 中使用注解,需要在原有 Spring 運行環境基礎上再做一些改變,完成以下三個步驟。
1、導入 AOP 的 Jar 包。因為注解的后臺實現用到了 AOP 編程。
2、 需要更換配置文件頭,即添加相應的約束。
約束在 %SPRING_HOME%\docs\spring-framework-reference\html\xsd-configuration.html 文件中。
3、需要在 Spring 配置文件中配置組件掃描器,用于在指定的基本包中掃描注解。
(1)使用多個 context:component-scan 指定不同的包路徑
(2) 指定 base-package 的值使用分隔符
分隔符可以使用逗號(,)分號(;)還可以使用空格,不建議使用空格。
逗號分隔:
分號分隔:
(3) base-package 是指定到父包名
base-package 的值表是基本包,容器啟動會掃描包及其子包中的注解,當然也會掃描到子包下級的子包。所以 base-package 可以指定一個父包就可以。
或者最頂級的父包
但不建議使用頂級的父包,掃描的路徑比較多,導致容器啟動時間變慢。指定到目標包和合適的。也就是注解所在包全路徑。例如注解的類在 com.bjpowernode.beans 包中
需要在類上使用注解@Component,該注解的 value 屬性用于指定該 bean 的 id 值。
舉例:di01
另外,Spring 還提供了 3 個功能基本和@Component 等效的注解:
● @Repository 用于對 DAO 實現類進行注解
● @Service 用于對 Service 實現類進行注解
● @Controller 用于對 Controller 實現類進行注解
之所以創建這三個功能與@Component 等效的注解,是為了以后對其進行功能上的擴展。
@Component 不指定 value 屬性,bean 的 id 是類名的首字母小寫。
需要在屬性上使用注解@Value,該注解的 value 屬性用于指定要注入的值。
使用該注解完成屬性注入時,類中無需 setter。當然,若屬性有 setter,則也可將其加到 setter 上。
舉例:
需要在引用屬性上使用注解@Autowired,該注解默認使用按類型自動裝配 Bean 的方式。
使用該注解完成屬性注入時,類中無需 setter。當然,若屬性有 setter,則也可將其加到 setter 上。
舉例:
需要在引用屬性上聯合使用注解@Autowired 與@Qualifier。@Qualifier 的 value 屬性用于指定要匹配的 Bean 的 id 值。同樣類中無需 setter,也可加到 setter 上。
舉例:
@Autowired 還有一個屬性 required,默認值為 true,表示當匹配失敗后,會終止程序運行。若將其值設置為 false,則匹配失敗,將被忽略,未匹配的屬性值為 null。
Spring提供了對 jdk中@Resource注解的支持。@Resource 注解既可以按名稱匹配Bean,也可以按類型匹配 Bean。默認是按名稱注入。使用該注解,要求 JDK 必須是 6 及以上版本。
@Resource 可在屬性上,也可在 set 方法上。
1、byType 注入引用類型屬性
@Resource 注解若不帶任何參數,采用默認按名稱的方式注入,按名稱不能注入 bean,則會按照類型進行 Bean 的匹配注入。
舉例:
2、byName 注入引用類型屬性
@Resource 注解指定其 name 屬性,則 name 的值即為按照名稱進行匹配的 Bean 的 id。
舉例:
在方法上使用@PostConstruct 與原來的 init-method 等效。在方法上使用@PreDestroy,與 destroy-method 等效。
舉例:
注解優點是:
● 方便
● 直觀
● 高效(代碼少,沒有配置文件的書寫那么復雜)。
其弊端也顯而易見:以硬編碼的方式寫入到Java代碼中,修改是需要重新編譯代碼的。
● 配置和代碼是分離的
● 在xml中做修改,無需編譯代碼,只需重啟服務器即可將新的配置加載。
● xml的缺點是:編寫麻煩,效率低,大型項目過于復雜。