Spring中注解的使用詳解


一:@Rsource注解的使用規則

1.1.案例演示 

Spring的主配置文件:applicationContext.xml(因為我這里將會講到很多模塊,所以我用一個主配置文件去加載各個模塊的配置文件):

 

具體業務模塊配置文件applicationContext-di-annotation.xml 

業務類Person.java和Student.java

---------------------------------------------------------------------------------------------------------------------------------------

客戶端代碼:

執行結果是:student_annotation 

1.2.使用總結

A:@Resource使用規則:

1.在spring的xml配置文件中導入命名空間及規范。

 

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-2.5.xsd

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的配置文件中導入命名空間及規范

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd

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注解,就會進行如下法則:

 

如果其value屬性的值為“”
@Component
public class Person(){
}
等價於
<bean id="person" class="......Person"></bean>(如果value值不寫,默認的是類名首字母小寫,其他不變)
如果其value屬性的值不為“”
@Component("p")
public class Person(){
}
等價於
<bean id="p" class="......Person"></bean>

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  

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM