1 前言
领域服务
createUserError1
调用private方法
createUserPrivate,被@Transactional
注解。当传入的用户名包含test
则抛异常,让用户的创建操作失败
getUserCount
用户接口层
调用UserService#createUserError1
测试结果
即便用户名不合法,用户也能创建成功。刷新浏览器,多次发现有十几个的非法用户注册。 @Transactional生效原则 public方法
除非特殊配置(比如使用AspectJ静态织入实现AOP),@Transactional必须定义在public方法才生效。
因为Spring的AOP,private方法无法被代理到,自然也无法动态增强事务处理逻辑。
那简单,把createUserPrivate方法改为public不就行了。
但发本文来源gao@!dai!ma.com搞$$代^@码!网!现事务依旧未生效。
必须通过代理过的类从外部调用目标方法
要调用增强过的方法必然是调用代理后的对象。
尝试修改UserService,注入一个self,然后再通过self实例调用标记有 @Transactional 注解的createUserPublic方法。设置断点可以看到,self是由Spring通过CGLIB方式增强过的类:
this/self/Controller调用UserDomainService
- this自调用