1.AOP的背景
(1)AOP:面向切面的编程技术,JAVA是OOP:面向对象的编程技术
(2)AOP是基于动态代理实现的
2.问题引出:
(1)什么是面向切面的编程技术;
<1>切面与切点是几何上面的术语
<2>将核心业务代码过程比作一个柱体
<3>其他的日志记录,权限校验等就像是横切核心业务的面
<4>这些面需要完成一些非核心的业务
(2)为什么要面向切面的编程技术;
<1>在平时的开发中,肯定会遇到下面几个面:1.权限校验;
2.业务的核心代码;
3.记录日志
4.异常/事物的处理
<2>@Service层采用代码累加的方法,那么结构就会如下:
@Service
public class myService{
@Resource
private CoreService coreService;
@Resource
private LogService logService;
@Resource
private PropertyService propertyService;
// 权限校验代码
//核心业务层代码
//记录日志的代码
// 异常/事物的处理
}
<3>上面的代码结构中可以看出以下几个问题:
1.代码混乱:核心业务模块与其他非核心的代码交织在一起,不利于代码的维护
2.冗余代码:权限的校验,异常的处理,日志的记录可以独立在一个模块给所有的服务公用,写在一起导致代码的分散和冗余
<4>因此面向切面的编程技术应运而生!!
(3)与OOP是什么关系
<1>AOP的实现技术有多种,其中与Java无缝对接的是一种称为AspectJ的技术
<2>Spring AOP 与AspectJ 实现原理上并不完全一致,但功能上是相似的
<3>AOP的出现解决外围业务代码与核心业务代码分离的问题,但它并不会替代OOP
<4>OOP的出现是把编码问题进行模块化,AOP就是把涉及到众多模块的某一类问题进行统一管理
3.AOP的核心概念
(1)切面(Aspect):是一个类,里面定义了通知与切点,Spring提供了四种aop切面的支持
<1>基于代理的经典的pringAop
<2>纯POJO切面
<3>@AspectJ注解驱动切面(底层也是Spring的动态代理 只是参考了AspectJ的一些形式)
<4>注入式Aspectj切面
(2)切点(PointCut):表达式。就是告诉程序要在执行哪些核心业务的时候,执行非核心的业务
(3)通知(advice):五种通知方式:
<1>@Before:前置通知,在调用目标方法之前执行通知定义的任务
<2>@After:后置通知,在目标方法执行结束后,无论执行结果如何都执行通知定义的任务
<3>@After-returning:后置通知,在目标方法执行结束后,如果执行成功,则执行通知定义的任务
<4>@After-throwing:异常通知,如果目标方法执行过程中抛出异常,则执行通知定义的任务
<5>@Around:环绕通知,在目标方法执行前和执行后,都需要执行通知定义的任务
4.切点表达式
(1)这个表达式有很多种,如方法签名表达式,类型签名表达式,还有其他的表达式
<1>方法签名表达式:
1.关键字:execution
2.execution (com.atguigu.spring.MyBean.*(…)):该通知将匹配MyBean中的所有方法
<2>类型签名表达式:
1.关键字:within
2.within(net.yangki.spring.demo.MyService): 该通知将匹配MyService类中的所有方法。