项目使用了Spring的声明式事务管理,其是通过Spring的Aop实现的,主要是对于所有开发人员都是透明的,不用开发人员进行管理。同时使用了Spring的自动代理功能进行实现。
主要由一下几部分声明组成,需要注意的是,Spring对于关键的一些类不关心名称,只关心类型,它根据类型进行装配。
A)声明自动代理类
xml 代码
- <bean id="proxyCreator"
- class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
2)事务拦截增强,定义一些事务管理的规则
xml 代码
- <bean id="txInterceptor"
- class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager" />
- <property name="transactionAttributes">
- <props>
- <prop key="save*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="delete*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="get*">
- PROPAGATION_REQUIRED,readOnly,-Exception
- </prop>
- <prop key="detail*">
- PROPAGATION_REQUIRED,readOnly,-Exception
- </prop>
- <prop key="*">
- PROPAGATION_REQUIRED,readOnly
- </prop>
- </props>
- </property>
- </bean>
3)定义pointcut和advice的装配器,即告知Spring,某个增强与某个切入点关联,在这里实现了一个切入点(pointcut) com.ufida.cvms.util.proxy.AutoLogicPointCut.
xml 代码
- <bean id="advisor"
- class="org.springframework.aop.support.DefaultPointcutAdvisor">
- <property name="pointcut">
- <bean class="com.ABC.bcd.util.proxy.AutoLogicPointCut" />
- </property>
- <property name="advice">
- <ref bean="txInterceptor" />
- </property>
- </bean>
切入点代码如下,主要实现Pointcut接口即可以。GetClassFilter方法中判断符合切入点类的规则。GetMethodMatcher返回符合切入点类中方法的规则。在这里,只增强了DefaultLogic类,及其子类。方法是类中的所有方法。因为Logic是业务得重要操作地方,所以事务管理到Logic就可以了。
java 代码
- public class AutoLogicPointCut implements Pointcut {
-
-
-
-
- public ClassFilter getClassFilter() {
- return new RootClassFilter(DefaultLogic.class);
- }
-
-
-
-
- public MethodMatcher getMethodMatcher() {
- return MethodMatcher.TRUE;
- }
-
- }