<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 小菜毛毛 閱讀(533) 評論(0)  編輯  收藏 所屬分類: J2EE相關技術與框架
    主站蜘蛛池模板: 久久国产乱子精品免费女| 亚洲福利在线视频| 日韩免费a级毛片无码a∨| 国产97视频人人做人人爱免费| 亚洲第一区二区快射影院| 久久久久亚洲AV成人无码| 国产亚洲精午夜久久久久久| 免费无码看av的网站| 免费人成网站在线观看10分钟| 免费观看成人久久网免费观看| 一区二区三区免费高清视频| 国产青草亚洲香蕉精品久久| 亚洲Av高清一区二区三区| 久久精品a亚洲国产v高清不卡| 亚洲人成77777在线播放网站| 免费国产成人高清在线观看麻豆| 免费中文熟妇在线影片| 永久看日本大片免费35分钟| 大地影院MV在线观看视频免费| 国产99视频精品免费视频76| 美女羞羞视频免费网站| 亚洲av色香蕉一区二区三区蜜桃| 色噜噜亚洲男人的天堂| 精品久久亚洲中文无码| 亚洲区精品久久一区二区三区| 亚洲成a人片在线网站| 亚洲精品国产成人| 亚洲性无码av在线| 亚洲国产精品张柏芝在线观看| 亚洲日本在线播放| 亚洲国产夜色在线观看| 亚洲人成在线免费观看| 亚洲一区二区三区在线观看蜜桃| 亚洲女人影院想要爱| 亚洲国产理论片在线播放| 亚洲小说区图片区| 亚洲高清视频在线| 国产精品亚洲片在线花蝴蝶| 黄网站色视频免费观看45分钟| 一级中文字幕免费乱码专区| 2022国内精品免费福利视频|