<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相關技術與框架
    主站蜘蛛池模板: 国产精品亚洲精品日韩已满| 中文永久免费观看网站| 国产aⅴ无码专区亚洲av麻豆 | 国产亚洲AV手机在线观看| 91精品免费国产高清在线| 亚洲伊人色一综合网| 真实乱视频国产免费观看| 午夜精品免费在线观看| eeuss影院免费直达入口| 在线观看亚洲网站| 2020国产精品亚洲综合网| 亚洲成人高清在线| a在线观看免费视频| 亚洲福利电影在线观看| 久久久久久久综合日本亚洲| 亚洲av无码成人精品区在线播放 | 精品久久久久亚洲| 久久亚洲国产午夜精品理论片| 亚洲国产成人久久精品99 | 2020久久精品亚洲热综合一本| 亚洲成人高清在线观看| 亚洲国产成人精品不卡青青草原| 亚洲精品无码精品mV在线观看| 亚洲精品无码日韩国产不卡?V| 国产又粗又长又硬免费视频| 久久一本岛在免费线观看2020| 两个人看的www高清免费视频| 亚洲综合无码一区二区痴汉| 亚洲丝袜中文字幕| 亚洲午夜成激人情在线影院| 亚洲影视一区二区| 激情亚洲一区国产精品| 亚洲国产精品成人综合久久久| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲精品国产专区91在线| 亚洲第一网站免费视频| 亚洲国产精品乱码在线观看97| 亚洲专区一路线二| 亚洲成AV人影片在线观看| 看一级毛片免费观看视频| 一级做a爰片久久毛片免费陪|