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

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

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

    隨筆-42  評論-578  文章-1  trackbacks-0

            基于Annotation的SSH整合開發,其實,并沒有我當初想像中那么順利。真正去做的時候,才發覺有許多問題。但不要緊,探索一下吧。在探索過程中學到知識,才是最重要的。
            言歸正傳,現在,我們加入Spring的支持:把spring-framework-2.5.5\dist中的spirng.jar引進我們項目的lib目錄來,還要添加\lib\aspectj\下的兩個jar包,以支持切面編程。
            必要的配置文件還是要的:
            applicationContext-common.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:context
    ="http://www.springframework.org/schema/context"
        xmlns:aop
    ="http://www.springframework.org/schema/aop"
        xmlns:tx
    ="http://www.springframework.org/schema/tx"
        xsi:schemaLocation
    ="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    >
                
        
    <!-- 配置SessionFactory,由Spring容器來管理Hibernate -->
        
    <!-- 非Annotation時,使用org.springframework.orm.hibernate3.LocalSessionFactoryBean,
            它注入實體類的方式是setMappingResources(),而Hibernate Annotation所用的映射方式
            不是mapping resource,而是mapping class,這就要用到LocalSessionFactoryBean的子類
            AnnotationSessionFactoryBean了.因為AnnotationSessionFactoryBean它支持實體的注入
            方式setAnnotatedClasses,即對應Hibernate中的mapping class.參見這兩個類的源代碼. 
    -->
        
    <bean id="sessionFactory"
            class
    ="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            
    <property name="configLocation">
                
    <value>classpath:hibernate.cfg.xml</value>
            
    </property>
        
    </bean>

        
    <!-- 配置事務管理器 -->
        
    <bean id="transactionManager"
            class
    ="org.springframework.orm.hibernate3.HibernateTransactionManager">
            
    <property name="sessionFactory">
                
    <ref bean="sessionFactory" />
            
    </property>
        
    </bean>
        
        
    <!-- 配置事務的傳播特性 -->
        
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
            
    <tx:attributes>
                
    <tx:method name="save*" propagation="REQUIRED" />
                
    <tx:method name="update*" propagation="REQUIRED" />
                
    <tx:method name="delete*" propagation="REQUIRED" />
                
    <tx:method name="*" read-only="true" />
            
    </tx:attributes>
        
    </tx:advice>
        
        
        
    <!-- 那些類的哪些方法參與事務 -->
        
    <aop:config>
            
    <aop:pointcut id="allServiceMethod" expression="execution(* com.rong.dao.*.*.*(..))" />
            
    <aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice" />
        
    </aop:config>
        
        
    <!-- 使Spring關注Annotation -->
        
    <context:annotation-config/>
        
        
    <!-- 讓Spring通過自動掃描來查詢和管理Bean -->
        
    <context:component-scan base-package="com.rong"/>
        
        
    <!-- 
        <bean id="userDao" class="com.rong.dao.UserDaoBean">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <bean id="userService" class="com.rong.service.UserServiceBean">
            <property name="userDao" ref="userDao"/>
        </bean>
         
    -->
        
    </beans>

            關鍵的兩點:

        <!-- 使Spring關注Annotation -->
        
    <context:annotation-config/>
        
        
    <!-- 讓Spring通過自動掃描來查詢和管理Bean -->
        
    <context:component-scan base-package="com.rong"/>

            這樣配置之后,就省去了上面注釋掉的DAO層和Service層等配置代碼。是不是很方便呢。
           關于這一部分的XML代碼,我們下面還會作解釋。

            來開發我們的DAO層吧,接口如下:

    package com.rong.dao;

    import java.util.List;
    import com.rong.entity.User;

    public interface UserDao {
        
        
    public void save(User user);
        
        
    public void delete(int id);
        
        
    public void update(User user);
        
        
    public List<User> query();
        
        
    public User get(int id);

    }

            DAO層的實現類:
    package com.rong.dao;

    import java.util.List;
    import org.springframework.stereotype.Repository;
    import com.rong.entity.User;

    @Repository(
    "userDao")        //聲明此類為數據持久層的類
    public class UserDaoBean extends MyHibernateDaoSupport implements UserDao {
        
        
    public void save(User user){
            
    super.getHibernateTemplate().save(user);
        }

        
        
    public void delete(int id){
            
    super.getHibernateTemplate().delete(super.getHibernateTemplate().load(User.class, id));
        }

        
        
    public void update(User user){
            
    super.getHibernateTemplate().update(user);
        }

        
        @SuppressWarnings(
    "unchecked")
        
    public List<User> query(){
            
    return super.getHibernateTemplate().find("from User");
        }

        
        
    public User get(int id){
            
    return (User)super.getHibernateTemplate().get("from User", id);
        }


    }

            大家可以看到,我們這里繼承的不是HibernateDaoSupport,而是我自己編寫的一個類MyHibernateDaoSupport。其代碼如下:
    package com.rong.dao;

    import javax.annotation.Resource;
    import org.hibernate.SessionFactory;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

    public class MyHibernateDaoSupport extends HibernateDaoSupport {
        
        @Resource(name
    ="sessionFactory")    //為父類HibernateDaoSupport注入sessionFactory的值
        public void setSuperSessionFactory(SessionFactory sessionFactory){
            
    super.setSessionFactory(sessionFactory);
        }


    }
            我們之所以要改寫HibernateDaoSupport,是因我為,我們要為DAO層的類注入SessionFactory這個屬性。以后,我們開發的DAO類,就可以直接重用這個MyHibernateDaoSupport了。其實,這樣做是相當于配置文件方式的代碼:        
        <bean id="userDao" class="com.rong.dao.UserDaoBean">
            
    <property name="sessionFactory" ref="sessionFactory"/>
        
    </bean>
            我們既然要用annotation代替XML文件的,就要讓它也能像原來那樣使用sessionFactory,故為MyHibernateDaoSupport注入SessionFactory。子類繼承這個類時,也繼承其Annotation。這樣,我們就可以實現SessionFactory的注入了。
             到現在,我們再回過頭來看applicationContext-common.xml中的
        <bean id="sessionFactory"
            class
    ="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            
    <property name="configLocation">
                
    <value>classpath:hibernate.cfg.xml</value>
            
    </property>
        
    </bean>
            我們平時開發Hibernate與Spring整合時,常常會用到org.springframework.orm.hibernate3.LocalSessionFactoryBean來提供SessionFactory,而我們這里卻要改成org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean。其實是這樣的,我們在Hibernate.cfg.xml中配置的實體類映射的方式如下:(詳見基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (1)
            <!--
            <mapping resource="com/rong/entity/User.hbm.xml"/>
             
    -->
             
             
    <!-- 在Hibernate中注冊User實體類,區別于上面注釋掉的resource寫法 -->
             
    <mapping class="com.rong.entity.User"/>
            要使Hibernate的實體類支持注解,去掉xxx.hbm.xml的文件,故我們所用的是mapping class方式,不是mapping resource的方法。然而,LocalSessionFactoryBean這個類,它采用的實體類映射方式是mapping resource,(詳情可參見LocalSessionFactoryBean這個類的源代碼)。如果我們在配置中仍然用這個類的話,Hibernate與Spring整合時,就會報錯。而AnnotationSessionFactoryBean這個類在LocalSessionFactoryBean的基礎上添加了mapping class方式實現實體類映射(詳見AnnotationSessionFactoryBean類的源代碼)。
            我們再來看Service層的代碼:(接口比較簡單,節約篇幅就不列出了)
    package com.rong.service;

    import java.util.List;
    import javax.annotation.Resource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.rong.dao.UserDao;
    import com.rong.entity.User;

    @Service(
    "userService")        //聲明此類為業務邏輯層的類
    public class UserServiceBean implements UserService {
        
        @Autowired
        
    private UserDao userDao;

        
    public void save(User user){
            userDao.save(user);
        }


    }
            我們用到的注解上面一般都作了注釋,就不多敘。@Autowired和@Resource功能差不多,就是把對象注入,相當于<bean>配置的功能。
            好,就開發到這樣,是不是忘記了什么?記得要配置web.xml,部分代碼如下:
          <!-- 修改Spring配置文件的路徑 -->
        
    <context-param>
            
    <param-name>contextConfigLocation</param-name>
            
    <param-value>classpath*:applicationContext-*.xml</param-value>
        
    </context-param>
        
        
    <!-- 配置Spring -->
        
    <listener>
            
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        
    </listener>

            是不是真的成功了?用Junit測試一下吧,我測試過是沒問題的,由于篇幅,Junit的測試代碼就不貼出來了。自己練習一下吧!
            其實,到現在為止,我們發覺我們的XML配置文件還是很多。其實,這樣想想,上一階段我們省去了xxx.hbm.xml這類的文件,這一階段,我們少去了<bean id="" class=""><property name="" ref="">這樣的配置項。而這些,正是我們項目開發中,大量使用的配置。而只要書寫簡單的Annotation注解,就可以省去這樣,我們何樂而不用。而那些我們保留的XML配置文件(如:數據庫連接,事務),這樣是寫死的,一個項目就寫一次或復制過來用,我們保留它又何妨?

            好,暫時到這里,我們還有下一階段的基于Annotation的SSH整合開發,我們將會以一個用戶注冊的例子,把Struts2的注解帶到我們的整合開發中來。一起期待吧!
            (*^-^*) 本文原創,轉載請注明出處, http://www.tkk7.com/rongxh7謝謝! (*^-^*)

    本文原創,轉載請注明出處,謝謝!http://www.tkk7.com/rongxh7(心夢帆影JavaEE技術博客)
        

    posted on 2009-03-25 01:05 心夢帆影 閱讀(13168) 評論(24)  編輯  收藏 所屬分類: Struts2.xHibernateSpring

    評論:
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-03-25 09:17 | awed
    對于在Hibernate上什么Annotation還比較好理解,但對于Spring的Service上使用就有點不理解了,對于多人協作開發的時候如何知道定義的DAO名呢,就像
    @Autowired
    private UserDao userDao;
    如果我在DAO層上定義的@Repository("userDao")不是 userDao的名字,那么是否是按類型來匹配  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-03-25 14:37 | super2
    <mapping class="com.rong.entity.User"/> 這個也應該零配置  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) [未登錄] 2009-03-26 17:41 | wolf
    嚴重支持中,加油~~你真的很不錯~~  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-04-30 16:59 | baidu:aids514
    仔細讀了下你的文章,的確寫的不錯,看得出來你花了很多時間在這上面

    呵呵,感謝和我們分享,謝謝。。

    不過,讀完,試完之后發現一些不足之處,呵呵,個人覺得,也不知道對不對

    在測試的時候,發現程序運行好慢,遠遠沒有spring2.0+hibernate3.2組合的

    無注釋運行的快,在web中還沒來及測試,不知道效果怎么樣。

    樓主能否做個測試呢?評價下有\無注釋的優與劣?

    靜候佳音....

    有結果可以發到我郵箱,我們也可以交流下:dukai1008@163.com  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-04-30 17:11 | baidu:aids514
    初步做了個測試

    但是發不上來,說我的是廣告,暈死了

    從[Test] INFO [2009-04-30 17:07:36,984] 到 [Test] INFO [2009-04-30 17:07:43,796]

    差不多用7秒之久,估計放到web中會快3到4秒

    明天測試下,今天下班了,呵呵  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) [未登錄] 2009-05-31 21:42 | hone
    ContextLoader - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in file [E:\setupsoft\Tomcat5.5\webapps\ssh2\WEB-INF\classes\com\rong\dao\impl\UserDaoBean.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-05-31 23:54 | 心夢帆影
    @hone
    你有沒有寫MyHibernateDaoSupport類?  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) [未登錄] 2009-06-02 14:06 | hone
    有寫MyHibernateDaoSupport這個類  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) [未登錄] 2009-06-02 14:13 | hone
    博主,我的郵箱是hone033@gmail.com,期待你的回復  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-06-08 09:54 | ufo
    www.gm365.com上發布的web server軟件UFO不會出現一個字節的內存泄漏和一個線程的不能回收,使用UFO做Web Server的好處是網站能做得很穩定,永遠也不會自己down掉;UFO在托管機房丟包率很高、遭受Hacker攻擊、互聯網 骨干網被黑等惡劣的環境條件下仍然能很好地運行;UFO在對付Hacker方面(防Hacker弄down和Hacker抓取不該訪問的資源)也有足 夠措施。
    另外,UFO幾乎不會進行垃圾回收,消耗CPU很少,在普通的PC Server上用UFO運行網站,平時CPU占用率<0.1%,最多時也不會超 過5%。您知道,JVM的垃圾回收會導致大量的運算,消耗很多CPU,從而導致Server的負載能力和響應速度下降。UFO在對象管理方面采 用了很好的機制和算法,做得很出色。用UFO運行網站,可以一直保證高負載能力,快速的響應速度和低CPU消耗。
      回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-06-13 20:09 | 吳丹勇
    寫的很好啊!受益良多!  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-07-28 22:53 | ynyee
    @awed
    他會根據你寫的變量名獲取到類型  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) [未登錄] 2009-12-03 17:56 | a
    在spring的配置文件中sessionFactory 為 AnnotationSessionFactoryBean,而在@Resource(name="sessionFactory")中使用的是org.hibernate.SessionFactory
    是否有問題?這兩個sessionFactory是什么關系?請指教
      回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2009-12-04 23:11 | 心夢帆影
    @a
    因為在本文中,為了使用getHibernateTemplate()方法,我們不得不繼承HibernateDaoSupport類,而在HibernateDaoSupport類中,有一個方法:
    public final void setSessionFactory(SessionFactory sessionFactory) {
    if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
    this.hibernateTemplate = createHibernateTemplate(sessionFactory);
    }
    }
    這是我們注入SessionFactory的入口方法,而既然我們采用了Annotation取代XML配置了,就需要HibernateDaoSupport類的setSessionFactory方法是加多一個注解:@Resource(value="sessionFactory")。
    然而,我們不能直接修改Hibernate的源碼,就只能繼承它,正如上文中我寫的MyHibernateDaoSupport類,再在MyHibernateDaoSupport類中通過super關鍵詞為父類注入AnnotationSessionFactory.  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2010-02-08 15:04 | 人字
    a  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2010-02-08 15:07 | 人字
    你好~!我現在也在整合ssh,不過遇到很到問題~!看了你的杰作真是佩服~!但是我還是菜鳥,你沒寫的東西我都寫不出來~!所以能不能麻煩你把整個項目的源碼,還有Spring+hibernate整合的測試代碼發給我啊?~!謝謝。。。  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2010-02-08 15:08 | 人字
    不好意思!忘了寫我的郵箱地址:346527107@qq.com ...無限感激  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2010-03-10 22:20 | 雙目魚
    小弟佩服!!  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2010-05-22 21:48 | 游客
    public final void setSessionFactory(SessionFactory sessionFactory) {
    if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
    this.hibernateTemplate = createHibernateTemplate(sessionFactory);
    }
    }


    MyHibernateDaoSupport 居然能夠 override setSessionFactory,神來之筆啊  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2010-07-13 23:53 |
    <mapping class="com.rong.entity.User"/>


    要是有上100個 實體,都得一個一個配么?  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2011-04-27 11:55 | daniu
    @特
    那就在實體類上也使用注解, 別用hbm.xml了
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <!-- 依賴注入數據源,注入正是上面定義的dataSource -->
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
    <list>
    <value>com.test.model</value>
    </list>
    </property>
    </bean>

    實體類直接注解即可
      回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2011-07-19 14:38 | 魚歸不知處
    你好!我現在正在整合SSH,看了你的文章,覺得非常不錯,可自己現在還是個菜鳥,麻煩你能否把整合的源碼發給我一份,萬分感謝!!!郵箱地址:253366940@qq.com  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2011-09-01 09:42 | 錢塘江
    您好,能把這個工程代碼發我郵箱么,謝謝575955073@qq.com  回復  更多評論
      
    # re: 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合開發 (2) 2013-03-15 14:36 | kkkkksyou
    @游客
    大哥 你看清楚 哪個是override 么?  回復  更多評論
      
    主站蜘蛛池模板: 亚洲最新永久在线观看| 亚洲黄色片在线观看| 免费在线观影网站| 亚洲蜜芽在线精品一区| 在线免费观看国产视频| 中文字字幕在线高清免费电影| 亚洲黄色片免费看| gogo全球高清大胆亚洲| 91精品免费观看| 污污视频网站免费观看| 亚洲精品国产免费| 亚洲国产成人久久一区久久| 1000部禁片黄的免费看| 日韩大片免费观看视频播放| 亚洲黄色免费观看| 亚洲国产成人精品女人久久久 | 亚洲av无码片区一区二区三区| 亚洲?V无码乱码国产精品| 在线免费观看亚洲| 又硬又粗又长又爽免费看| 亚洲一级毛片视频| 亚洲VA中文字幕无码毛片| 国产精品99久久免费| 最近中文字幕大全免费视频 | 成人人观看的免费毛片| 久久久精品免费国产四虎| 色偷偷尼玛图亚洲综合| 亚洲成人福利在线| 亚洲日韩激情无码一区| 日本一道本高清免费| 亚洲网站免费观看| 成人爽a毛片免费| 美女被爆羞羞网站免费| 亚洲六月丁香六月婷婷色伊人| 亚洲精品无码MV在线观看| 免费看小12萝裸体视频国产| 在线观看的免费网站| 美丽姑娘免费观看在线观看中文版 | 中文字幕在线视频免费| 全黄A免费一级毛片| 边摸边吃奶边做爽免费视频网站|