Spring Boot教程(20) – 用AspectJ实现AOP内部调用

你一定用过@Transactional注解吧,它加在方法上可以实现声明式事务。第一次接触到它的时候,我感觉这种设计挺完美的。后来发现由于它是基于Spring AOP的代理实现的,所以有个坑——不支持内部调用的。

比如你的@Service类,里面有个A方法,调用了带有@Transactional注解的B方法,那么你在调用A方法,执行到B方法的时候是没有事务关联的。因为A调用B的时候,并不是通过代理类,而事务相关逻辑是放在代理类的。

如果你还不懂面向切面编程(AOP),不懂什么是代理,不妨看看我之前的文章

(更多…)

继续阅读 →

Spring Boot教程(17) – 快速理解AOP

AOP,Aspect-oriented Programming,面向切面编程,是你接触Spring之后比较难理解的概念。网上也有很多文章来介绍它,但是我老是看不懂,上来就一堆术语,头大。在我详细解释AOP之前,先用一句话说明他的典型用法:

把对象修改一下或者包装起来,在它方法执行的前后,额外运行点代码

很多时候你不知不觉就使用了AOP:在@Component类中,你在方法上加了@Transactional注解之后,方法执行前会开始事务,方法执行之后结束事务,方法发生异常之后回退事务;加上@Async注解之后,方法最终被调用的时候是异步的;加上@Cacheable注解之后,方法的返回值会被缓存起来,下次调用的时候直接返回缓存值。这些都是框架提供给你的,你只要加个注解声明一下就能用。

同时你也可以编写AOP代码来实现自己需求,比如在方法执行之前开始计时,在方法结束之后停止计时,来得到方法的运行时间;比如在业务的关键地方加上log;比如权限控制、懒加载等等。使用AOP的特点就是侵入性比较小,你的业务代码不用动,降低耦合度,方便团队分工。

(更多…)

继续阅读 →