AOP(Aspect-Oriented Programming,面向切面编程):能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
功能:让关注点(事物处理、权限、日志)和业务代码分离。
Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib 。
事物:逻辑上的一组操作,保证要么同时成功,要么同时失败(失败之后会回滚) 例子:A给B转账,
设计到两条sql语句,一个是A账户减100,另一个是B账户加100,这个过程卸在Service层,
所以在Service层都会加上事物。
public void transfer(A a, B b, double money) {
// 开启事物 (重复的代码)关注点代码
调用dao代码:a-100;
调用dao代码:b+100;
// 关闭事物
}
AOP中注解的含义
@Aspect:切面。表示一个横切进业务的一个对象。它里面包含切入点(Pointcut)和Advice(通知)。
@Pointcut:切入点。表示需要切入的位置,比如某些类或者某些方法,也就是先定一个范围。
AOP通知:
1、前置通知@Before:在方法调用之前执行
2、后置通知@AfterReturning:在方法正常调用之后执行
3、环绕通知@Around:在方法调用之前和之后,都分别可以执行的通知
4、异常通知@AfterThrowing:如果在方法调用过程中发生异常,则通知
5、最终通知 @After:在方法调用之后执行,类似于finally