一:@Rsource注解的使用規則
1.1.案例演示
Spring的主配置文件:applicationContext.xml(因為我這里將會講到很多模塊,所以我用一個主配置文件去加載各個模塊的配置文件):
具體業務模塊配置文件applicationContext-di-annotation.xml
業務類Person.java和Student.java
---------------------------------------------------------------------------------------------------------------------------------------
客戶端代碼:
執行結果是:student_annotation
1.2.使用總結
A:@Resource使用規則:
2.在spring的xml配置文件中引入注解解析器。
<context:annotation-config></context:annotation-config>
3.在spring的xml配置文件中把bean引入進來。
4.在一個類的屬性上加
@Resource(name="student_annotation")
public Student student;
從該注解本身
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
String name() default "";
}
可以看出:1.該注解可以用於屬性或者方法上,但一般用於屬性上。2.該注解的作用范圍是runtime。3.該注解有一個屬性name,默認值為“”。
有點要注意@Resource注解只能作用於引用類型的屬性上。
B:加入了注解之后的整個執行過程:
1.當啟動spring容器的時候,spring容器加載了配置文件。
2.在spring配置文件中,只要遇到bean的配置,就會為該bean創建對象。
3.在納入spring容器的范圍內查找所有的bean,看哪些bean的屬性或者方法上加有@Resource。
4.找到@Resource注解之后,判斷該注解的name屬性是否為“”(name沒有寫)
如果沒有寫name屬性,則會讓屬性的名稱和spring容器中bean的Id值做匹配,匹配成功則賦值;如果匹配不成功,則按照類型匹配,如果匹配不成功,就報錯。
如果寫了name屬性,則會按照name屬性的值和spring的bean中ID進行匹配,匹配成功,則賦值,不成功則報錯。
C:@Resource與@Autowired
@Resource與@Autowired都是做bean的注入時使用。其實@Resource並不是spring的注解,它是jdk擴展包javax.annotation.Resource中的,需要導入使用,但 spring支持該注解的使用。
1.@Autowired
@Autowired為Spring提供的注解,需要導入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照類型(byType)裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它的required屬性為false。
如果我們想使用按照名稱(byName)來裝配,可以結合@Qualifier注解一起使用 ,如下:
@Autowired
@Qualifier("student_annotation") 等價於 @Resource(name="student_annotation")
2.@Resource
@Resource默認按照ByName自動注入,由J2EE提供,需要導入包javax.annotation.Resource。 @Resource有兩個重要的屬性:name和type,而Spring將 @Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。 所以,如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則 使用byType自動注入策略。 如果既不制定name也不制定type屬性,這時將通過反射機制使用byName自動注入策略。
二:使用注解把一個類放到spring容器中
2.1.案例演示
Spring的主配置文件:applicationContext.xml(因為我這里將會講到很多模塊,所以我用一個主配置文件去加載各個模塊的配置文件):
具體業務模塊配置文件applicationContext-scan-annotation.xml
業務類Person.java和Student.java
-----------------------------------------------------------------------------------------------------------------------------------
客戶端代碼:
執行結果:student_annotation
2.2.使用總結
A:@Component的使用規則
1.在spring的配置文件中導入命名空間及規范
2.引入類掃描及注解解析器
<context:component-scan base-package="com.olymtech.spring.annotation.scan"></context:component-scan>
a:該注解解析器包含了兩個功能:依賴注入和類掃描(包含了<context:annotation-config></context:annotation-config>)
b:base-package:在該包及子包中掃描
3.如果一個類或者接口上(一般都是類上),加了@Component注解,就會進行如下法則:
4.按照上面的@Resource法則再次進行操作。
2.3.注解與XML的區別
A:注解書寫簡單,但效率低(應為解析器要掃描類注解,完了再掃描屬性注解),但比起網絡的效率,它完全可以忽略不計(你服務器效率再高,我提交一個http請求, 咔,網斷了,或網絡阻塞,服務器效率再高有啥用?) 。
B:xml書寫麻煩,但效率高(不存在掃描)
三:類掃描注解和依賴注入注解聯合使用
2.1.Document文檔讀寫案例演示
Spring的置文件:applicationContext-document.xml:
業務類:Document接口,DocumentManager類,ExcelDocument類,PdfDocument類,WordDocument類
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------
客戶端代碼:
執行結果:read word
writer word
2.2.模仿web的MVC案例演示
Spring的置文件:applicationContext-mvc.xml:
業務類:
控制層:
服務層:
-----------------------------------------------------------
持久層:
--------------------------------------------------------
客戶端代碼:
執行結果:save person dao
四:spring中關於類掃描注解和依賴注入注解的歸納總結
Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。 @Component是所有受Spring管理組件的通用形式; 而@Repository、@Service和 @Controller則是@Component的細化, 用來表示更具體的用例(例如,分別對應了持久化層、服務層和表現層)。也就是說, 你能@Component來注解你的組件類, 但如果用@Repository、@Service 或@Controller來注解它們,你的類也許能更好地被工具處理,或與切面進行關聯。 例如,這些典型化注解可以成為理想的切入點目標。當然,在Spring Framework以后的版本中, @Repository、@Service和 @Controller也許還能攜帶更多語義。 如此一來,如果你正在考慮服務層中是該用 @Component還是@Service, 那@Service顯然是更好的選擇。 同樣的,就像前面說的那樣, @Repository已經能在持久化層中進行異常轉換時被作為標記使用了。
-----------常用注解--------
--定義Bean的注解(類掃描注解)
@Controller
@Controller("Bean的名稱")
定義控制層Bean,如Action
@Service
@Service("Bean的名稱")
定義業務層Bean
@Repository
@Repository("Bean的名稱")
定義DAO層Bean
@Component
定義Bean, 不好歸類時使用.
--自動裝配Bean (依賴注入注解;選用一種注解就可以)
@Autowired (Srping提供的)
默認按類型匹配,自動裝配(Srping提供的),可以寫在成員屬性上,或寫在setter方法上
@Autowired(required=true)
一定要找到匹配的Bean,否則拋異常。 默認值就是true
@Autowired
@Qualifier("bean的名字")
按名稱裝配Bean,與@Autowired組合使用,解決按類型匹配找到多個Bean問題。
@Resource JSR-250提供的
默認按名稱裝配,當找不到名稱匹配的bean再按類型裝配.
可以寫在成員屬性上,或寫在setter方法上
可以通過@Resource(name="beanName") 指定被注入的bean的名稱, 要是未指定name屬性, 默認使用成員屬性的變量名,一般不用寫name屬性.
@Resource(name="beanName")指定了name屬性,按名稱注入但沒找到bean, 就不會再按類型裝配了.
@Inject 是JSR-330提供的
按類型裝配,功能比@Autowired少,沒有使用的必要。
--定義Bean的作用域和生命過程
@Scope("prototype")
值有:singleton,prototype,session,request,session,globalSession
@PostConstruct
相當於init-method,使用在方法上,當Bean初始化時執行。
@PreDestroy
相當於destory-method,使用在方法上,當Bean銷毀時執行。
--聲明式事務
@Transactional