1. AOP 是软件设计领域中的面向切面编程,他是面向对象的一种补充和完善。实际项目中我们通常将面向对象理解为一个静态过程(例如一个系统有多少模块,一个模块有哪些对象,对象有哪些属性),面向切面中包含一个一个动态过程(在对象运行时动态织入一些功能)
Aop 就是要在基于 OCP (开闭原则)在不改变原有系统核心业务代码的基础上动态的添加一些扩展功能并可以控制对象的执行(例如可以让这个业务继续执行,也可以让这个业务停止执行)
2. AOP底层基于代理机制实现功能扩展:
1)假如目标对象(被代理对象)实现接口,则底层默认采用JDK动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)
2)假如目标对象(被代理对象)没有实现接口,则底层默认采用CGLIB代理机制,为目标对象创建代理对象(默认创建的代理类会继承目标对象类)
3.相关术语
切面(aspect);横切面对象,一般为一个具体的类对象(可以借助@Aspect声明)
连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的方法
切入点(pointcut):对连接点拦截内容的一种定义,一般可以理解为多个连接点的结合。
通知(Advice):在切面的某个特定连接点上执行的动作(扩展功能),例如around,befor,after 等
4. 数据访问流程:
业务层在执行时,会先产生一个代理对象,底层通过代理对象为目标对象扩展新的功能
5.通知注解:
@Pointcut("bean(sysUserServiceImpl)")
public void doPointCut(){};
@Around("doPointCut()")
//在目标方法成功执行结束以后执行
@AfterReturn(@annotation(com.demo.annotation.RequeredClearCatch))
public void stopAfterExecption(JoinPoint jp){}
//在目标方法出现异常后执行
@AfterThrowing("@annotation(com.demo.annotation.RequeredClearCatch)")
public void doAfterThrowing(JoinPoint joinPoint, Throwable e){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
//在目标方法执行之前执行
@Before("@annotation(com.demo.annotation.RequeredClearCatch)")
//最终通知,不管目标方法怎么样,他都会执行
@After("@annotation(com.demo.annotation.RequeredClearCatch)")
结构如下:
try {
@Before
核心业务
@AfterReturn
} catch (Exception e) {
@AfterThrowing
}finally{
@After
}