<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

    Spring2.5中基于注釋的IoC

    關鍵字: spring2.5 注釋 ioc

           基于注釋(Annotation)的配置有越來越流行的趨勢,Spring 2.5 順應這種趨勢,提供了完全基于注釋配置 Bean、裝配 Bean 的功能,您可以使用基于注釋的 Spring IoC 替換原來基于 XML 的配置。

      

       注釋的優勢

           它可以充分利用 Java 的反射機制獲取類結構信息,這些信息可以有效減少配置的工作。如使用 JPA 注釋配置 ORM 映射時,我們就不需要指定 PO 的屬性名、類型等信息,如果關系表字段和 PO 屬性名、類型都一致,您甚至無需編寫任務屬性映射信息——因為這些信息都可以通過 Java 反射機制獲取。
           注釋和 Java 代碼位于一個文件中,而 XML 配置采用獨立的配置文件,大多數配置信息在程序開發完成后都不會調整,如果配置信息和 Java 代碼放在一起,有助于增強程序的內聚性。而采用獨立的 XML 配置文件,程序員在編寫一個功能時,往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會降低開發效率。
          

           因此在很多情況下,注釋配置比 XML 配置更受歡迎,注釋配置有進一步流行的趨勢。Spring 2.5 的一大增強就是引入了很多注釋類,現在您已經可以使用注釋配置完成大部分XML 配置的功能。在這篇文章里,我們將向您講述使用注釋進行 Bean 定義和依賴注入的內容。

        原來我們是怎么做的

    UserDAO.java:

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2. /**  
    3.  * UserDAO接口  
    4.  *   
    5.  * @author tanlan tl_smile@163.com  
    6.  *   
    7.  * @date 2009-8-3  
    8.  */  
    9. public interface UserDAO {   
    10.     public void addUser();   
    11. }  

     

     UserJDBCDAO.java:

     

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2. /**  
    3.  * UserDAO的JDBC實現  
    4.  *   
    5.  * @author tanlan tl_smile@163.com  
    6.  *   
    7.  * @date 2009-8-3  
    8.  */  
    9.   
    10. public class UserJDBCDAO implements UserDAO {   
    11.     public void addUser() {   
    12.         System.out.println("使用JDBC增加用戶信息!");   
    13.     }   
    14.   
    15. }  

     

    UserService.java:

     

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2. /**  
    3.  * User業務邏輯處理類  
    4.  *   
    5.  * @author tanlan tl_smile@163.com  
    6.  *   
    7.  * @date 2009-8-3  
    8.  */  
    9. public class UserService {   
    10.     private UserDAO userDAO;   
    11.   
    12.     public void addUser() {   
    13.         userDAO.addUser();   
    14.     }   
    15.   
    16.     public UserDAO getUserDAO() {   
    17.         return userDAO;   
    18.     }   
    19.   
    20.     public void setUserDAO(UserDAO userDAO) {   
    21.         this.userDAO = userDAO;   
    22.     }   
    23.   
    24. }  

     配置文件 spring.xml:
     

    Xml代碼 復制代碼
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    5.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    6.     <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    7.     <bean id="userService" class="com.tanlan.springdemo.UserService">  
    8.         <property name="userDAO" ref="userJdbcDAO"></property>  
    9.     </bean>  
    10. </beans>  

     測試類Test.java:

     

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. import org.springframework.context.ApplicationContext;   
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;   
    5.   
    6. public class Test {   
    7.   
    8.     public static void main(String[] args) {   
    9.         String[] files = { "spring.xml" };   
    10.         ApplicationContext context = new ClassPathXmlApplicationContext(files);   
    11.         UserService userService = (UserService) context.getBean("userService");   
    12.         userService.addUser();   
    13.     }   
    14.   
    15. }  

     

    使用 @Autowired 注釋

              Spring 2.5 引入了 @Autowired 注釋,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。

     

    對UserService.java的改進:

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. import org.springframework.beans.factory.annotation.Autowired;   
    4.   
    5. /**  
    6.  * User業務邏輯處理類  
    7.  *   
    8.  * @author tanlan tl_smile@163.com  
    9.  *   
    10.  * @date 2009-8-3  
    11.  */  
    12. public class UserService {   
    13.     @Autowired  
    14.     private UserDAO userDAO;   
    15.   
    16.     public void addUser() {   
    17.         userDAO.addUser();   
    18.     }   
    19. }  

     

    這個類甚至可以省略getter/setter.

     

    配置文件spring.xml的改進:

    Xml代碼 復制代碼
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    5.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    6.     <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>  
    7.     <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    8.     <bean id="userService" class="com.tanlan.springdemo.UserService"></bean>  
    9. </beans>  

     

          Spring 通過一個 BeanPostProcessor 對 @Autowired 進行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。

            UserService類的屬性不需要配置了。

    當候選 Bean 數目不為 1 時的應對方法

            在默認情況下使用 @Autowired 注釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將拋出BeanCreationException 異常,并指出必須至少擁有一個匹配的 Bean。
           和找不到一個類型匹配 Bean 相反的一個錯誤是:如果 Spring 容器中擁有多個候選Bean,Spring 容器在啟動時也會拋出 BeanCreationException 異常。
           Spring 允許我們通過 @Qualifier 注釋指定注入 Bean 的名稱

    加入現在多了一個UserDAO的實現類

    UserHibernateDAO.java:

     

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. /**  
    4.  * UserDAO的Hibernate實現  
    5.  *   
    6.  * @author tanlan tl_smile@163.com  
    7.  *   
    8.  * @date 2009-8-3  
    9.  */  
    10. public class UserHibernateDAO implements UserDAO {   
    11.     public void addUser() {   
    12.         System.out.println("使用Hibernate增加用戶信息!");   
    13.     }   
    14. }  

     

    更新spring.xml:

    Xml代碼 復制代碼
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    5.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    6.     <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>  
    7.     <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    8.     <bean id="userHibernateDAO" class="com.tanlan.springdemo.UserHibernateDAO"></bean>  
    9.     <bean id="userService" class="com.tanlan.springdemo.UserService"></bean>  
    10. </beans>  

     

    當Spring自動找尋UserDAO類型的類時,會找到兩個符合要求的類:

     No unique bean of type [com.tanlan.springdemo.UserDAO] is defined: expected single matching bean but found 2: [userJdbcDAO, userHibernateDAO]

     

    需要改進UserService.java:

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. import org.springframework.beans.factory.annotation.Autowired;   
    4. import org.springframework.beans.factory.annotation.Qualifier;   
    5.   
    6. /**  
    7.  * User業務邏輯處理類  
    8.  *   
    9.  * @author tanlan tl_smile@163.com  
    10.  *   
    11.  * @date 2009-8-3  
    12.  */  
    13. public class UserService {   
    14.     @Autowired  
    15.     @Qualifier("userJdbcDAO")   
    16.     private UserDAO userDAO;   
    17.   
    18.     public void addUser() {   
    19.         userDAO.addUser();   
    20.     }   
    21. }  

     

    使用 <context:annotation-config/> 簡化配置

            Spring 2.1 添加了一個新的 context 的 Schema 命名空間,該命名空間對注釋驅動、屬性文件引入、加載期織入等功能提供了便捷的配置.

           改進spring.xml:

    Xml代碼 復制代碼
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3. xmlns:context="http://www.springframework.org/schema/context"  
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    6.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    7.     <context:annotation-config></context:annotation-config>  
    8.     <bean id="userJdbcDAO" class="com.tanlan.springdemo.UserJDBCDAO"></bean>  
    9.     <bean id="userHibernateDAO" class="com.tanlan.springdemo.UserHibernateDAO"></bean>  
    10.     <bean id="userService" class="com.tanlan.springdemo.UserService"></bean>  
    11. </beans>  

     注意命名空間:xmlns:context=http://www.springframework.org/schema/context的添加。

    以及<context:annotation-config/>的使用。

    使用 @Component

     Spring 2.5 提供的 @Component 注釋可以定義 Bean,從 XML 配置文件中完全移除 Bean 定義的配置。

    改進UserJDBCDAO.java:

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. import org.springframework.stereotype.Component;   
    4.   
    5. /**  
    6.  * UserDAO的JDBC實現  
    7.  *   
    8.  * @author tanlan tl_smile@163.com  
    9.  *   
    10.  * @date 2009-8-3  
    11.  */  
    12. @Component("userJdbcDAO")   
    13. public class UserJDBCDAO implements UserDAO {   
    14.     public void addUser() {   
    15.         System.out.println("使用JDBC增加用戶信息!");   
    16.     }   
    17.   
    18. }  

     

    改進UserHibernateDAO.java:

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. import org.springframework.stereotype.Component;   
    4.   
    5. /**  
    6.  * UserDAO的Hibernate實現  
    7.  *   
    8.  * @author tanlan tl_smile@163.com  
    9.  *   
    10.  * @date 2009-8-3  
    11.  */  
    12. @Component("userHibernateDAO")   
    13. public class UserHibernateDAO implements UserDAO {   
    14.     public void addUser() {   
    15.         System.out.println("使用Hibernate增加用戶信息!");   
    16.     }   
    17. }  

     

    改進UserService.java:

    Java代碼 復制代碼
    1. package com.tanlan.springdemo;   
    2.   
    3. import org.springframework.beans.factory.annotation.Autowired;   
    4. import org.springframework.beans.factory.annotation.Qualifier;   
    5. import org.springframework.stereotype.Component;   
    6.   
    7. /**  
    8.  * User業務邏輯處理類  
    9.  *   
    10.  * @author tanlan tl_smile@163.com  
    11.  *   
    12.  * @date 2009-8-3  
    13.  */  
    14. @Component  
    15. public class UserService {   
    16.     @Autowired  
    17.     @Qualifier("userJdbcDAO")   
    18.     private UserDAO userDAO;   
    19.   
    20.     public void addUser() {   
    21.         userDAO.addUser();   
    22.     }   
    23. }  

     

    改進spring.xml:

    Xml代碼 復制代碼
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3. xmlns:context="http://www.springframework.org/schema/context"  
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    6.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    7.     <context:component-scan base-package="com.tanlan.springdemo"></context:component-scan>  
    8. </beans>  

     

          在使用 @Component 注釋后,Spring 容器必須啟用類掃描機制以啟用注釋驅動 Bean 定義和注釋驅動 Bean 自動注入的策略.
           <context:component-scan/> 的 base-package 屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會被處理.

    注釋配置和 XML 配置的適用場合

           是否有了這些 IOC 注釋,我們就可以完全摒除原來 XML 配置的方式呢?答案是否定的。有以下幾點原因:
           注釋配置不一定在先天上優于 XML 配置。如果 Bean 的依賴關系是固定的,(如Service 使用了哪幾個 DAO 類),這種配置信息不會在部署時發生調整,那么注釋配置優于 XML 配置;反之如果這種依賴關系會在部署時發生調整,XML 配置顯然又優于注釋配置,因為注釋是對 Java 源代碼的調整,您需要重新改寫源代碼并重新編譯才可以實施調整。
    如果 Bean 不是自己編寫的類(如 JdbcTemplate、SessionFactoryBean 等),注釋配置將無法實施,此時 XML 配置是唯一可用的方式。
           注釋配置往往是類級別的,而 XML 配置則可以表現得更加靈活。比如相比于@Transaction 事務注釋,使用 aop/tx 命名空間的事務配置更加靈活和簡單。
          

           所以在實現應用中,我們往往需要同時使用注釋配置和 XML 配置,對于類級別且不會發生變動的配置可以優先考慮注釋配置;而對于那些第三方類以及容易發生調整的配置則應優先考慮使用 XML 配置。Spring 會在具體實施 Bean 創建和 Bean 注入之前將這兩種配置方式的元信息融合在一起。

     

    posted on 2009-08-06 08:37 小菜毛毛 閱讀(531) 評論(0)  編輯  收藏 所屬分類: J2EE相關技術與框架
    主站蜘蛛池模板: 国产亚洲精品成人久久网站| 37pao成人国产永久免费视频| 免费精品视频在线| 精品乱子伦一区二区三区高清免费播放| 国产亚洲精品美女| 99re6免费视频| 国产免费人人看大香伊| 亚洲第一福利视频| 国产亚洲精品AAAA片APP| 成人网站免费看黄A站视频| 操美女视频免费网站| 久久亚洲精品视频| 精品免费AV一区二区三区| 亚欧免费一级毛片| 免费中文字幕不卡视频| 亚洲剧情在线观看| 免费国产叼嘿视频大全网站| 免费无码又爽又刺激高潮| 亚洲日本va午夜中文字幕一区| 亚洲av永久无码天堂网| 99久久国产热无码精品免费| 免费一级毛片在线播放不收费 | 69天堂人成无码麻豆免费视频| 亚洲国产成人精品无码久久久久久综合| 亚洲精品无码成人片久久| 偷自拍亚洲视频在线观看99| 欧美三级在线电影免费| 亚洲综合国产精品| 女人体1963午夜免费视频| 免费在线一级毛片| 国产成人亚洲综合a∨| 狠狠久久永久免费观看| 亚洲精品国产日韩| 欧洲精品成人免费视频在线观看 | 亚洲一区二区无码偷拍| 免费国产在线视频| 亚洲制服中文字幕第一区| 麻豆精品成人免费国产片| 日韩精品亚洲人成在线观看| 三年片在线观看免费大全电影 | 国产免费MV大全视频网站|