??因为要在业务层上进行事务管理,我们可以产生一个代理类来对业务层的transfer方法进行增强。这个代理类叫做事务代理工厂类,它可以为业务层类产生一个代理对象。其中属性包括目标对象target即为我们需要去代理的类,然后是注入事务管理器进行事务管理,也就是对代理对象进行事务增强。springaop注解事物而进行事务管理还需要一些具体的信息比如传播行为和隔离级别等等,所以还需配置transactionAttribute属性,然后再向这个属性中传入参数props,也就是键值对,key代表的是方法,这里只有一个方法transfer,也可以写一个 * 代表类中所有方法。而prop的值可以是PROPAGATION(事务的传播行为),ISOLATIONf(事务的隔离级别) -Exception(发生哪些异常回滚事务) +Exception(发生哪些事务不回滚)。在这里我只配了PROPAGATION_REQUIRED,这个传播行为代表业务层方法中的转入转出调用的时候,是处在一个事务之中。
业务层
采取了AOP思想,业务层就不再需要配置多余的代码了。
向测试类中注入代理类

在编程式事务管理中, @ Resource是业务类,而现在业务类是没有被增强过的类,所以要替换为业务类增强后的代理类即 @Resource(name="accountServiceProxy")。
测试
当没有异常时进行转账:

当设置异常之后,钱数没有发生改变,事务回滚了:

添加readOnly之后
当设置为只读后,就不允许进行修改了


配置事务管理器
配置事务的通知
??需要有事务的管理器,事务相关的属性,属性里面的method即为哪些方法要来执行你的事务,跟这个方法相关的还有相应的事务传播行为和隔离级别等等。
配置切面
??在切点当中的表达式第一个 * 代表方法的返回值,AccountService后的+代表他的子类,最后的 * (..)代表任意的方法和参数。切面则由切点和增强构成,即在这个切点上运用这个增强。代表切面的标签有两个,一个是 < aop:aspect > 代表多个切入点和多个通知,另一个是 < aop:advisor > 代表一个切入点和一个通知,这个例题里只有一个增强“txAdvice”,所以就使用了asvisor标签。
aop自动代理

??我划线的部分不再需要修改,因为这种基于AspectJ的方式是属于自动代理,也就是在XML中没有显式配置 < aop:aspectj-autoproxy/ >不代表不使用自动代理,这条配置默认属性为“false”,表示只代理接口(JDK动态代理),所以如果只想代理接口,可以不用显式写出。也就是说现在的 < bean > 这个类在生成的时候就是一个代理对象了,所以 @Resource(name="accountService")已经是被增强过了。如果还对自动代理不清楚,请看我另一篇文章:Spring之AOP由浅入深
测试
事务发生了回滚

配置事务管理器
开启注解事务
??哪个类需要使用事务管理,就在那个类头加上 @Transactional注解即可。
@Transactional 注解中的属性
直接在注解后面即可添加相应的传播行为,隔离级别等等
测试结果
事务发生了回滚

作者:六月的余晖
出处:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-86311-3.html
但是作为演员
煽动反政府情绪