一般来讲,控制事务都应该是在services层去做的,但是我想问一下,在spring中是否应该使用声明式事务来进行控制。还有没有其他的方法,一般我们看到比较常用的是spring去调用hibernate的事务方法。(是在xml中进行配置)
那么最重要的一点是:我如何让spring来辨别我的事务是在service层,还是在dao层进行的控制呢,这一点如何去配置。是在配置文件中,还是在每个service的java文件中?
那么最重要的一点是:我如何让spring来辨别我的事务是在service层,还是在dao层进行的控制呢,这一点如何去配置。是在配置文件中,还是在每个service的java文件中?
个人推荐使用声明式 编程式的声明方式对代码是有侵略性的 不建议使用
声明式事务体现了aop的核心思想 在spring中可以由xml配置实现
<aop:config >
<aop:aspect id="aophandler" ref="aopHandler">
<aop:pointcut id="engine1" expression="execution(* bc.engine.*.biz.impl.*.*(..))"/>
<aop:after method="keepLog" pointcut-ref="engine1"/>
<aop:pointcut id="engine2" expression="execution(* bc.engine.iflow.biz.*Impl.*(..))"/>
<aop:after method="keepLog" pointcut-ref="engine2"/>
<aop:pointcut id="tbmbiz" expression="execution(* bc.tbm.*.business.*HandlerImpl.*(..))"/>
<aop:after method="keepLog" pointcut-ref="tbmbiz"/>
<aop:pointcut id="pmsbiz" expression="execution(* bc.pms.*.service.impl.*.*(..))"/>
<aop:after method="keepLog" pointcut-ref="pmsbiz"/>
</aop:aspect>
</aop:config>上面是一个配置实例 你可以了解一下 看下spring的aop和声明式事务控制部分
希望对你有帮助
Spring的事务分为申明式事务,以及编程式事务。 我们用的最多的还是申明式事务。因为申明式事务解耦,事务不用跟业务代码耦合起来,以后更改事务控制也方便。 不需要对每一个事务都进行控制配置的。。 可以用通配符:* 来进行模糊匹配。
还有,spring的事务并不是只能在用hibernate时才使用,他对JPA,JTA,JDBC,hibernate等持久层技术都提供不同的事务支持。 事务的东西,不是别人三言两语就能跟你说清楚的。 介绍你看<spring in action>第二版,有中文版的,做为Spring的入门书,这是一个不错的选择。只要你肯去啃这本书,相信你会很有收获。。
一般不在DAO进行配置,DAO一般是单一性的操作,
只要你的SERVICE是按照一定的规则定义的,完全一个配置就可以定义所有的切入点,切入点匹配是通过JAVA的正则表达式进行匹配的。。只要你按照类名可以挑出所有需要配置的类就可以了
我们使用SSH是为了使开发业务逻辑更清晰、专业分工,降低程序之间的耦合性。Hibernate用来做持久层,Spring作业务层,因此权限控制应理所应当放在业务层处理。
而Spring AOP的面向切面编程的能力,能够实现业务逻辑与权限控制的分离和解耦。你只需声明控制的切入点,不需要去管业务逻辑,就能在这些切入点进行权限拦截。而声明切点也是很简单灵活的,如果你觉得对每一个service都要进行控制配置声明麻烦,就像3楼说的,可以用*通用匹配。
我的了解是在每个service类中都需要加入@transactional标示符,请问如果这样的话,是不是配置文件那边也还要去用aop标签去配置
<!-- 配置事务传播特性 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="get*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice> <!-- 配置哪些类的哪些方法参与事务 -->
<aop:config>
<aop:advisor pointcut="execution(* com.lookhan.service..*.*(..))" advice-ref="transactionAdvice" />
</aop:config>
不知道楼主问的是不是这个。* com.lookhan.service..*.*(..)表示在service包下及其子包的所有类的所有方法,以及方法的任何参数和返回值。
通过AOP 给service层通配个事务拦截器就行了
这个就是基本的配置好不好,上面是针对不同的方法的,如果你真的非要再简单点的,那就只加一个*就可以了。你要怎样的简单?再怎么简单也要针对一个Service里面的方法吧,这个总得配置吧。
事务的配置:
<bean id="TransAction"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor" >
<property name="advice">
<ref local="TranInterceptor" />
</property>
<property name="mappedNames">
<list>
<value>*TransAction</value>
</list>
</property>
</bean>
<bean id="TranInterceptor" class="TransactionInterceptor" />
类TransactionInterceptor写具体的事务处理,在Business层添加 Bean TransAction,Business层的类有关事务处理的方法要以TransAction结尾
2、声明式事务。
3、注解式事务。在DAO层启动事务,我还木有用过。怎么判断事务是在哪个层启动的,我也不知道
你指的是对某个方法的事务指定,我说的是针对某一个类的事务指定,比如在service层中有多个逻辑类,那么里面肯定都会用到类似的事务处理,因此我只要对该类进行配置就可以了。