ssh整合分解

移动开发 Android
Spring整合Hibernate,是做了一个很大的调整的,因为spring可以把管理Hibernate的工作都做了,以前的hibernate.cfg.xml文件都去掉了,而将这些内容都交给了spring来管理了。

一、 Spring+Hibernate整合:
Spring整合Hibernate,是做了一个很大的调整的,因为spring可以把管理Hibernate的工作都做了,以前的hibernate.cfg.xml文件都去掉了,而将这些内容都交给了spring来管理了。
1、 applicationContext.xml文件中应该配置如下内容:
Java代码

  1. //配置数据连接类  
  2. <bean id=“dataSource”  
  3. class=“org.apache.commons.dbcp.BasicDataSource”>  
  4. <property name=“driverClassName”  
  5. value=“org.gjt.mm.mysql.Driver”>  
  6. </property>  
  7. <property name=“url” value=“jdbc:mysql://localhost:3306/test”></property>  
  8. <property name=“username” value=“root”></property>  
  9. </bean>  
  10. //配置session工厂类  
  11. <bean id=“sessionFactory”  
  12. class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>  
  13. <property name=“dataSource”>  
  14. <ref bean=“dataSource” />  
  15. </property>  
  16. <property name=“hibernateProperties”>  
  17. <props>  
  18. <prop key=“hibernate.dialect”>  
  19. org.hibernate.dialect.MySQLDialect  
  20. </prop>  
  21. <prop key=“hibernate.show_sql”>true</prop>  
  22. </props>  
  23. </property>  
  24. <property name=“mappingResources”>  
  25. <value>com/hejianjiao/vo/Person.hbm.xml</value>  
  26. </property>  
  27. </bean>  
  28. //配置数据连接类 
  29. <bean id="dataSource" 
  30.    class="org.apache.commons.dbcp.BasicDataSource"
  31.    <property name="driverClassName" 
  32.     value="org.gjt.mm.mysql.Driver"
  33.    </property> 
  34.    <property name="url" value="jdbc:mysql://localhost:3306/test"></property> 
  35.    <property name="username" value="root"></property> 
  36. </bean> 
  37. //配置session工厂类 
  38. <bean id="sessionFactory" 
  39. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
  40.    <property name="dataSource"
  41.     <ref bean="dataSource" /> 
  42.    </property> 
  43.    <property name="hibernateProperties"
  44.     <props> 
  45.      <prop key="hibernate.dialect"
  46.       org.hibernate.dialect.MySQLDialect 
  47.      </prop> 
  48.      <prop key="hibernate.show_sql">true</prop> 
  49.     </props> 
  50.    </property> 
  51.    <property name="mappingResources"
  52.    <value>com/hejianjiao/vo/Person.hbm.xml</value> 
  53.    </property> 
  54. </bean> 

2、可以使用spring中的HibernateDAOSupport与HibernateTemplate类来进行数据持久化操作:
A、HibernateDAOSupport类中定义了对session、sessionFactory的操作方法与getHibernateTemplate方法来获得一个HibernateTemplate实例;
B、HibernateTemplate类中定义了对数据持久化的各种封装的方法,我们可以用它来对数据进行操作。
因此在使用时,我们可以继承HibernateDAOSupport类,然后实例化HibernateTemplate类来进行数据持久化。
二、 Spring+Struts2整合:

1、spring配置在web.xml文件中的上下文监听器:
Java代码

  1. <context-param>  
  2. <param-name>contextConfigLocation</param-name>  
  3. <param-value>/WEB-INF/applicationContext*.xml</param-value>  
  4. </context-param> 
  5.  
  6. <listener>  
  7. <listener-class>org.springframwork.web.content.ContextLoaderListener</listener-class>  
  8. </listener>  
  9. <context-param> 
  10. <param-name>contextConfigLocation</param-name> 
  11. <param-value>/WEB-INF/applicationContext*.xml</param-value> 
  12. </context-param> 
  13.  
  14. <listener> 
  15. <listener-class>org.springframwork.web.content.ContextLoaderListener</listener-class
  16. </listener>2、struts2配置在web.xml文件中的过滤器: 
  17. Java代码 
  18. <filter>  
  19. <filter-name>struts2</filter-name>  
  20. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  21. </filter> 
  22.  
  23. <filter-mapping>  
  24. <filter-name>struts2</filter-name>  
  25. <url-patter>/*</url-patter>  
  26. </filter-mapping>  
  27. <filter> 
  28. <filter-name>struts2</filter-name> 
  29. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class
  30. </filter> 
  31.  
  32. <filter-mapping> 
  33. <filter-name>struts2</filter-name> 
  34. <url-patter>/*</url-patter> 
  35. </filter-mapping> 

3、设置struts.xml文件,就可以使用spring的IOC来管理struts的Action:
Java代码

  1. <content name=“struts.objectFactory” value=“spring” >  
  2. <content name="struts.objectFactory" value="spring" > 

4、第三步设置后,以后在struts.xml 文件中配置一个action时,它的class就不是一个类了,而是在applicationContext.xml文件中定义过的类的ID,在 struts.xml文件中就只需要引用定义好的类的id 就可以了。
然后特别要注意的一个问题:action是一个请求就是一个action对 象,而在spring中则不是的,它是自动分配类的实例的,是使用的单 态模式来生产类的实例的,不符合action,因此在applicationContext.xml文件中定义每个action时,都要在类后加上:
Java代码
scope=“prototype” 属性 
scope="prototype" 属性三、 三者组合开发:
一般在组合开发时,没有什么难的,只要把上面两步做好就可以是三个组合开发了。 上图则是对于进行组合开发时,一般使用的系统架构:
1、 先从***层开发,先开发POJO类,和Hibernate映射文件。它相当于系统的数据库层。
2、 再开发DAO层,它是对于数据进行持久化的一层,专门处理各种数据增、删、改、查的功能。并且使用DAO工厂模式,以保证和上层没有任何的联系,并且可以方便于类与接口的扩展。
3、 第三是开发manager层,它相当于软件的业务逻辑层,即专门处理各种业务逻辑。实现系统的业务处理功能。并且它隔离事务,使与下层的数据持久和上层的数据操作没有任何的联系。
4、 Action层,也即软件的表示层,处理action的接收与回复。各action由spring管理。
五、 组合开发中的一些问题:
1、 在组合开发中,常见的一个问题就是session的管理,当我们使用HibernateTemplate操作数据库时,可以不对session进行显示的操作,spring可以自动处理session的打开与关闭。
我们可以在web.xml文件中显示的配置一个session管理的过滤器,它专门帮助我们关闭session:
Java代码

 

  1. <filter>  
  2. <filter-name>lazyLoadingFilter</filter-name>  
  3. <filter-class>  
  4. org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter  
  5. </filter-class>  
  6. </filter> 
  7.  
  8. <filter-mapping>  
  9. <filter-name>lazyLoadingFilter</filter-name>  
  10. <url-pattern>*.action</url-pattern>  
  11. </filter-mapping>  
  12. 注:它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。  
  13. <filter> 
  14.         <filter-name>lazyLoadingFilter</filter-name> 
  15. <filter-class
  16. org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter 
  17. </filter-class
  18. </filter> 
  19.  
  20. <filter-mapping> 
  21.          <filter-name>lazyLoadingFilter</filter-name> 
  22.          <url-pattern>*.action</url-pattern> 
  23. </filter-mapping> 

注:它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。它会在所有的action处理完了,页面显示完了,就会自动关闭session。
六、 spring事务处理
1、事务的处理也交给了spring来管理,要在applicationContext.xml文件中上配置事务管理类:
Java代码
//实施事务管理的bean

  1. <bean id=”transactionManager”  
  2. class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”>  
  3. <property name=”sessionFactory”>  
  4. <ref bean=”sessionFactory” />  
  5. </property>  
  6. </bean>  
  7. //实施事务管理的bean 
  8. <bean id=”transactionManager” 
  9. class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”> 
  10.        <property name=”sessionFactory”> 
  11.            <ref bean=”sessionFactory” /> 
  12. </property> 

</bean>它是通过sessionFactory来管理,因此在传进来一个sessionFactory来接管事务处理。
2、 声明式事务处理:
在spring中对事务进行管理时,可以显示地进行事务处理的定义:
Java代码

  1. <tx:advice id=”txAdvice” transaction-manager=”transactionManager”>  
  2. <tx:attributes >  

//propagation表示的是事务的传播特性,使用required时,是当检测到add开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。

 

  1. <tx:method name=”add*” propagation=”REQUIRED”>  
  2. <tx:method name=”delete*” propagation=”REQUIRED”>  
  3. <tx:method name=”update*” propagation=”REQUIRED”>  
  4. //如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。  
  5. <tx:method name=”*” read-only=”true”>  
  6. </tx:attributes>  
  7. </tx:advice>  
  8. //给事务添加的属性 
  9. <tx:advice id=”txAdvice” transaction-manager=”transactionManager”> 
  10.      <tx:attributes > 

//propagation表示的是事务的传播特性,使用required时,是当检测到add开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。
          <tx:method name=”add*” propagation=”REQUIRED”>
          <tx:method name=”delete*” propagation=”REQUIRED”>
           <tx:method name=”update*” propagation=”REQUIRED”>
//如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。
           <tx:method name=”*” read-only=”true”>
</tx:attributes>
</tx:advice>对于事务的其它传播属性,则可以参考其它文档进行相关的了解。
上 一个配置是针对于所有包中类的事务处理方法的设置。下面一段是<aop:config/> 的定义,它确保由 ‘txAdvice’ bean定义的事务通知在应用中合适的点被执行。首先我们定义了 一个切面,它匹配 HibernateDAO 接口定义的所有操作,我们把该切面叫做 ‘allManagerMethod’。然后我们用一个通知器(advisor)把这个切面与 ‘txAdvice’ 绑定在一起,表示当 ‘allManagerMethod’ 执行时,’txAdvice’ 定义的通知事务逻辑将被执行。这就是AOP切面工程:
Java代码

  1. Java代码 
  2. <aop:config>  
  3. <aop:pointcut id=”allManagerMethod”  
  4. expression=”execution(* com.hejianjiao.hibernate.HibernateDAO.*(..))”/>  
  5. //调用上面配置的事务属性,可以将它给本aop pointcut。  
  6. <aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/>  
  7. //如果还有其它的定义,则可以再加上pointcut、advisor来定义本切面点的事务逻辑。  
  8. </aop:config>  
  9. <aop:config> 
  10.       <aop:pointcut id=”allManagerMethod” 
  11. expression=”execution(* com.hejianjiao.hibernate.HibernateDAO.*(..))”/> 
  12. //调用上面配置的事务属性,可以将它给本aop pointcut。 
  13.       <aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/> 
  14. //如果还有其它的定义,则可以再加上pointcut、advisor来定义本切面点的事务逻辑。 

</aop:config> //expression中的内容是要执行本切面的一个接口,中的所有方法:如:一个接口中定义了操作数据的方 法:com.hejianjiao.hibernate.HibernateDAO,则下面execution括号中的内容就为:* com.hejianjiao.hibernate.HibernateDAO.*(..)。而如果在com.hejianjiao.hibernate 包中还有其它的类也有操作方法,我们要一起定义的话,就可以写为:* com.hejianjiao.*.*(..),其中(..)表示的是方法,前面的***个*是操作的接口或者类。
上面的配置将为由 ‘HibernateDAO’ 定义的bean创建一个代理对象,这个代理对象被装配了事务通知,所以当它的相应方法被调用时,一个事务将被启动、挂起、被标记为只读,或者其它(根据该方法所配置的事务语义)

本文链接:http://my.oschina.net/heiyexue/blog/296692

责任编辑:chenqingxiang 来源: oschina
相关推荐

2009-06-02 14:09:37

myeclipse smyeclipse开发myeclipse

2011-03-02 10:04:40

SSHDMR

2009-08-14 09:40:55

MyEclipse整合

2012-05-03 10:13:56

FlexSSHJava

2017-08-24 09:19:20

分解技术揭秘

2022-11-03 15:18:20

Python组件算法

2010-09-02 14:53:19

DHCP Relay

2009-03-04 10:38:36

XenDesktop 桌面虚拟化Xendesktop

2021-07-07 09:00:00

分解式存储架构云服务

2013-09-17 13:10:17

TCP协议网络协议

2011-06-16 16:20:32

JavaScript分解任务

2010-03-30 18:56:13

Nginx配置模块

2011-08-22 10:40:07

SSH命令SSH命令

2023-02-15 09:00:00

算法推荐系统矩阵分解算法

2010-08-30 09:07:12

DHCP工作流程

2022-10-08 16:26:23

APP应用开发

2012-10-24 17:30:54

MozillaFacebook

2010-04-21 13:48:48

网络负载平衡

2017-02-08 09:25:16

Spark分解推荐

2022-08-07 22:07:35

微服务架构
点赞
收藏

51CTO技术栈公众号