陈建华的博客
专注web开发
Spring+hibernate+springmvc 整合(步骤,代码,详细)
2014-06-12 11:27:20   阅读2432次

版本介绍:spring3.0  、hibernate3.6

开发工具:myeclipse7.5

整合目标:从spring2.5 升级到spring 3.0,兼容2.5的旧代码中的xml方式bean 配置,同时能够使用3.0的特性,比如注解,springmvc注解等。从hibernate 3  升级到hibernate3.6。兼容3版本的xml 持久bean 配置,同时能够使用注解方式配置。简单2个字:混用。

整合步骤:

一、jar 包替换:

删除旧工程 以上3个框架的jar包;

spring 包

org.springframework.aop-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.aspects-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.context.support-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.jdbc-3.0.5.RELEASE.jar
org.springframework.orm-3.0.5.RELEASE.jar
org.springframework.spring-library-3.0.5.RELEASE.libd
org.springframework.test-3.0.5.RELEASE.jar
org.springframework.transaction-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar

spring全包下载地址:

spring-framework-3.0.5.RELEASE.zip

 


Hibernate 库包:

hibernate3.jar

hibernate3.zip


依赖包:

antlr-2.7.6.jar
aopalliance.jar
aspectjrt.jar
aspectjweaver.jar
cglib-nodep-2.1_3.jar
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-dbcp.jar
commons-fileupload-1.2.1.jar
commons-io-2.0.jar
commons-lang-2.5.jar
commons-logging.jar
commons-pool.jar
dom4j-1.6.1.jar
gson-1.6.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
javassist-3.12.0.GA.jar
junit-4.8.1.jar
log4j-1.2.15.jar
mysql-connector-java.jar
slf4j-api-1.6.1.jar
slf4j-nop-1.6.1.jar

以上jar文件有些是spring 和hibernate 的依赖包。比如common 工具包、aop 包、cglib 包,有些是我自己的工程需要的其他包。比如gson  mysql junit

依赖包下载:

依赖包.zip


二、整合spring

a)  web.xml 文件配置

<context-param>        
  
  <param-name>webAppRootKey</param-name>         
  
  <param-value>webapp.root</param-value>    
  
</context-param>  
  
<context-param>  
  
  <param-name>contextConfigLocation</param-name>  
  
<param-value>/WEB-INF/applicationContext*.xml,classpath*:applicationContext*.xml,classpath*:exception_config.xml</param-value>  
 </context-param>  
     <!-- log4j config  ------- 必须在spring context listener 前 或者上面定义的 webapp.Root 环境变量无法在log4j 的配置文件里使用-->  
    <listener>  
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    </listener>  
 <!-- Spring ApplicationContext 载入 -->  
 <listener>  
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  
 </listener>  
<!--  Character Encoding filter -->  
 <filter>  
  <filter-name>encodingFilter</filter-name>  
  <filter-class>  
   org.springframework.web.filter.CharacterEncodingFilter  
  </filter-class>  
  <init-param>  
   <param-name>encoding</param-name>  
   <param-value>UTF-8</param-value>  
  </init-param>  
  <init-param> 
   <param-name>forceEncoding</param-name>  
<param-value>true</param-value>  
 </init-param>  
 </filter>  
 <filter-mapping>  
  <filter-name>encodingFilter</filter-name>  
  <url-pattern>/*</url-pattern>  
 </filter-mapping>  
<!-- Spring 刷新Introspector防止内存泄露 --> 
 <listener> 
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> 
 </listener>

 

B)application.xml文件

<!--  扫描注解 -->  
  <context:component-scan base-package="*">  
         <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
</context:component-scan>  
<!--  定义注解事务支持  -->  
<tx:annotation-driven  transaction-manager="transactionManager"/>  
<!-- aop 支持 -->  
<aop:config>  
<aop:pointcut id="serviceOperation"  expression="execution(* org.pp..*.*(..))"/>
<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>  
</aop:config>  
<tx:advice id="txAdvice">  
<tx:attributes>  
<tx:method name="get*" read-only="true"/>  
<tx:method name="find*" read-only="true"/> 
<tx:method name="*" propagation="REQUIRED" /> 
</tx:attributes>  
</tx:advice>  
<!--  旧系统 配置-->  
<bean id="transactionBase"  
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"  
        lazy-init="true" abstract="true">  
        <property name="transactionManager" ref="transactionManager" />  
        <property name="transactionAttributes">  
            <props>  
                <prop key="create*">PROPAGATION_REQUIRED</prop>  
                <prop key="update*">PROPAGATION_REQUIRED</prop>  
                <prop key="delete*">PROPAGATION_REQUIRED</prop> 
                <prop key="merge*">PROPAGATION_REQUIRED</prop>  
                <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>  
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
                <prop key="*">PROPAGATION_REQUIRED</prop>  
            </props> 
        </property>  
    </bean>


三、 整合hibernate  

a)  

 Web.xml

<!-- Hibernate Open Session in View Filter-->  
 <filter> 
  <filter-name>hibernateFilter</filter-name>  
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
 </filter>  
     <filter-mapping>  
  <filter-name>hibernateFilter</filter-name>  
  <url-pattern>/*</url-pattern> 
 </filter-mapping>  
 <filter>

  

b)    Spring  中配置  

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName" value="com.mysql.jdbc.Driver"> 
        </property>  
        <property name="url"  
    value="jdbc:mysql://localhost:3306/test_szoa?characterEncoding=utf-8"></property>  
        <property name="username" value="root"></property> 
    </bean>  
    <bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource" />
        </property> 
        <property name="hibernateProperties"> 
            <props> 
                <prop key="hibernate.dialect"> 
                    org.hibernate.dialect.MySQLInnoDBDialect  
                </prop>  
                <prop key="hibernate.show_sql">true</prop>  
            </props> 
        </property> 
        <property name="mappingDirectoryLocations"> 
            <list>  
                <value>classpath:icom/szoa/</value> 
            </list> 
        </property>  
<!-- 自动扫描hibernate 注解 -->  
            <property name="packagesToScan"> 
            <list> 
                <value>icom.**.domain</value>
            </list>
        </property>
    </bean>


C)  事务配置

<bean   id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" /> 
        <property name="fetchSize" value="20" /> 
    </bean>
    <!-- TransactionManager --> 
    <bean id="transactionManager" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" /> 
    </bean>


四、spring mvc 配置

A )web.xml 文件

<!--   spring mvc -->  
    <servlet> 
        <servlet-name>dmt</servlet-name> 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/*-servlet.xml</param-value> 
        </init-param> 
        <load-on-startup>0</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>dmt</servlet-name> 
        <url-pattern>*.do</url-pattern> <!--匹配跳转的后缀名-->  
</servlet-mapping>

  

B)Dmt-serverlet.xml 文件  

<context:component-scan base-package="com.hb"  use-default-filters="false">  
         <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
    </context:component-scan> 
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>  
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"  lazy-init="false"/>
 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" /> 
    </bean>  
    <!-- 配置  xml 方式下的url mapping 和 parameterMethod  
    在 整合进注解 mvc 后 必须加上 SimpleControllerHandlerAdapter 的配置 
     -->  
   <bean id="urlMapping" 
   class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> 
   <property name="order" value="1"></property>  
   </bean>
   <bean  class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 
   <bean id="methodNameResolver"  class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
   <property name="paramName" value="method" /> 
   <property name="defaultMethodName" value="index" />  
   </bean>


五、整合中 可能出现的问题:

    a) 注入失败:由于spring 实现aop 的默认方式是jdk 的动态代理,使用注解自动注入的时候,注入的对象必须是接口

    b) 事务不提交:仔细观察spring 主配置文件和spring mvc 配置文件会发现自动扫描的内容是有区别的。如果不加区别很可能导致mvc 配置文件先中的扫描先于主配置文件执行,而mvc 文件中的扫描对事务注解不做处理。

    c) 旧的mvc url 配置不可访问,在使用xml配置controller 的时候经常使用BeanNameUrlHandlerMapping加入注解的配置后,这些controller 变为不可访问。原因是springmvc 注解改了默认配置。注意SimpleControllerHandlerAdapter 的配置。

    d) Xml 文件名空间问题。

项目源码:

springmvc_hibernate_spring.zip




-----------------------------------------------------
转载请注明来源此处
原地址:#

-----网友评论----
暂无评论
-----发表评论----
微网聚博客乐园 ©2014 blog.mn886.net 鲁ICP备14012923号   网站导航