`

九:Spring与Struts,Hibernate的集成

    博客分类:
  • ssh
阅读更多
九:Spring与Struts,Hibernate的集成

target :目标
proxy :代理
transaction :事务
propagation :传播
schema :样式
advisor :顾问

目标
9.1:Spring与Hibernate的集成
9.1.1:使用Spring简化Hibernate编码
9.1.2:配置数据源和SessionFactory
9.2:使用Spring重新组装Web程序
9.2.1:使用Spring管理依赖关系
9.2.2:与Struts集成
9.3:声明式事务
9.3.1:应用系统中的事务管理
9.3.2:1.x的方式
9.3.3:Spring2.0的方式
小结:


目标
掌握Srping与Struts,Hibernate的集成(简化DAO层代码),管理依赖关系和事务,会使用Spring实现声明式事务。
9.1:Spring与Hibernate的集成
9.1.1:使用Spring简化Hibernate编码
BaseHibernateDAO实现过接口FwxxDAO,此时可以:继承自org.springframework.orm.hibernate3.support.HibernateDaoSupport并implements这个接口。代码示例:super.getHibernateTemplate().update(fwxx);
Spring为HibernateDaoSupport类提供了setSessionFactory方法,以此向DAO类注入SessionFactory。
9.1.2:配置数据源和SessionFactory
在配置文件中,需要定义一个SessionFactory Bean才能注入到DAO类中。
一:使用Spring提供的LocalSessionFactoryBean,传入一个Hibernate配置文件的位置。在开发阶段,生成新的实体类时会自动添加在Hibernate配置文件中,不用手动修改Spring的配置文件。缺点是:无法有效的和DataSource进行集成,故,在部署到“生产机”是,需采用另一种配置方法(二)。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propery name="configLocation"><value>classpath:hibernate.cfg.xml</value></property>
</bean>
二:配置<bean id="dataSource"></bean>和<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"></bean>
注入:
<bean id="fwxxDAO" class="com.apatech.jb.dao.hibimpl.FwxxDaoHibImpl" ><property name="sessionFactory" ref="sessionFactory"/></bean>
9.2:使用Spring重新组装Web程序
9.2.1:使用Spring管理依赖关系
程序的依赖关系是:Action-->Biz-->DAO-->SessionFactory-->DataSource。使用Spring管理这些依赖关系,注入的方向刚好相反。(ds-->sf-->dao-->biz-->action)。
1),去掉直接实例化FwxxDAO接口实例的代码(解除biz对dao的依赖,做到“面向接口”)。
2),增加fwxxDAO属性的setter方法,方便注入。
3),到Spring配置文件中定义fwxxBizBean.
9.2.2:与Struts集成
Action类的实例由Struts创建,由于要使用Spring管理Action对Biz的依赖,Action类就要由Spring来创建。Struts可以以插件的方式扩展,可利用Spring提供的ContextLoadPlugin插件即可做到Spring与Struts的无缝集成。
1),在Struts配置文件中配置插件,
2),将Struts配置文件中Action类别都配置为“org.springframework.web.struts.DelegatingActionProxy”
3),在Spring配置文件中配置FwxxAction,注意:<bean>没有id属性,name属性的值要与struts配置中相应Action  Bean的path属性一致。
9.3:声明式事务
9.3.1:应用系统中的事务管理
事务处理:
1,JDBC方式:将Connection(JDBC中,事务依附在Connection对象上)对象以参数的方式传来传去。(Connection在业务逻辑层或者表示层出现,破坏了三层结构的基本原则)
2,将业务逻辑层代码放到Dao层实现,Dao层依据业务逻辑创建方法,编写复杂的业务逻辑处理代码。(降低了软件的质量——质量是软件的生命线)
要保证自己的代码逻辑清晰,规范易读,不要抱着侥幸的心理破坏规矩。事务是系统开发过程的一个“方面”,散布在系统里,可以通过AOP技术将其放在一起是实现。
9.3.2:1.x的方式(分布式事务的配置方法)
Spring声明式事务(在配置文件中完成):1,声明一个事务管理器,需要注入sessionFactory属性;2,给需要事务的方法添加事务支持(与AOP的实现相似),首先定义xxxTarget,然后定义xxxBiz,其中,1),class属性为org.springframework.transaction.intercepor.TransactionProxyFactoryBean,2),将事务管理器(transactionManager)和代理对象(target)注入;3)对事务属性(transactionAttributes)进行声明。
(相关概念:Spring AOP的实现采用代理的方式,首先要定义被代理的对象,然后注入到代理类中)
相关代码:
1:
<bean id="fwxxBizTarget" class="com.aptech.jb.biz.impl.FwxxBizImpl">
<property name="fwxxDao" ref="fwxxDAO"/>
</bean>
<!--2.1:-->
<bean id="fwxxBiz" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--2.2:-->
<property name="transactionManager" ref="myHibTransactionManager"/>
<property name="target" ref="fwxxBizTarget"/>
<!--2.3:-->
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

解释:
事务属性的定义:<prop key="add*" >PROPAGATION_REQUIRED</prop>,key表示匹配方法的模式,可以使用'*'通配符,属性值有五个可选值,分别是:
propagation_required(传播_必需的):当前方法必须运行在一个事务环境中,如果一个现有事务正在运行中,该方法将运行在这个事务中,否则,就要开始一个新的事务;
propagation_mandatory(命令的; 强制的; 义务的):当前方法必须运行在一个事务上下文中,否则抛出异常;
propagation_never( 从不, 永不, 从来没有):当前方法不应该运行在一个事务中,否则就抛出异常;
propagation_requires_new:当前方法必须运行在自己的事务里;
propagation_supports:当前方法不需要事务处理环境,但如果有一个事务正在运行的话,这个方法也可以运行在这个事务里。
习惯:
业务逻辑层方法的事务属性设置为"propagation_required",若想提高效率,对不需要更改数据库数据的方法也可作如下配置:<prop key="*" >propagation_required,readonly</prop>,"*"表示匹配所有其他的方法,readOnly表示启用只读事务(数据库可以采取合理的优化措施避免不必要的操作)。
技巧(类似定义“基类”解决重复性编码的技巧):
定义“基类”,设置其abstract属性为true,表示不可以直接得到其实例,可以“继承”自这个基类,轻松定义多个业务逻辑Bean。(基类——abstract,子类中添加parent属性,并设置target属性)

9.3.3:Spring2.0的方式
对比1.x:1.x是一种“侵入式”的解决方案,只是没有侵入到程序代码中去而已(需要而外配置一个代理对象,原来的Bean的声明也要修改)。
优势:可以在配置代码不变的基础上给Bean的方法添加事务支持。
步骤:1,添2.0的Jar包(spring.jar,aspectjrt.jar,aspectjweaver.jar,cglib-nodep-2.1._3.jar);2,修改配置文件,增加常用命名空间的声明;重新启用项目,项目正常启动,表示项目中采用的Spring版本更新成功。
(直接添加Spring2.0的jar包河2.0风格的配置文件到项目即可)
2.0的配置:
1,通过<tx:advice>定义事务通知,需要指定一个事务管理器,然后在其属性中声明事务规则,含义与1.x类似。
2,定义切面(pointcut,即定义哪些方法应用这些规则)
<aop:pointcut id="bizMehtods" expression="execution(* com.appech.jb.biz.*.*(..))"/>  表示:在com.apetch.jb.biz包下所有的方法都应该应用事务规则。
3,将事务通知和切面组合
<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMehtods"/>

成熟的三层架构+MVC的框架:Struts主持大局,Hibernate负责持久化工作,Spring管理组件间的依赖并提供事务支持,在稳定性和生产效率上具有极佳的平衡性。
小结:
Spring为Hibernate开发提供了良好的支持,可以大大简化Hibernate的编码。
在Spring配置文件定义dataSource,SessionFactory再注入到DAO中是开发中常用的做法。
Spring依赖注入在项目中用于管理程序间的依赖,使我们更容易做到面向接口编程。
Spring可以采用Struts插件的方式与Struts轻松集成。
Spring支持声明式事务,可以以不写一行程序代码的方式给系统增加事务支持。2.0的方式更为简洁,易懂。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics