1.AOP概念简单介绍
AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
2.定义切入点
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut("@annotation( com.UseLogAnnotation)")
public void logPoinCut() {
}
3.定义通知
通知种类具体详情可参考大神博客
通知有5种
1.前置通知:在目标方法执行之前执行执行的通知。
@Before
2.环绕通知:在目标方法执行之前和之后都可以执行额外代码的通知。
环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。
环绕通知有控制目标方法是否执行、有控制是否返回值、有改变返回值的能力。
@Around()
切记,如果方法有返回值,会被拦截,返回值为null,如果需要就返回
@Around("logPoinCut()")
public Object saveSysLog(ProceedingJoinPoint joinPoint) throws Throwable {
//获取返回对象
Object object = joinPoint.proceed();
return object;
}
3.异常通知
在目标方法抛出异常时执行的通知
可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位,另外,还可以配置参数,让异常通知可以接收到目标方法抛出的异常对象。
@AfterThrowing()
4.后置通知
return 中定义返回值,可直接获取返回值
@AfterReturning(value = “logPoinCut()”,returning = “object”)
@AfterReturning(value = "logPoinCut()",returning = "object")
public void saveSysLog(JoinPoint joinPoint,Object object) throws Throwable {
//获取返回值 object就是返回值
}
5.最终通知
@After
是在目标方法执行之后执行的通知。和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返-例如抛出异常,则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。另外,后置通知可以通过配置得到返回值,而最终通知无法得到。最终通知也可以额外接收一个JoinPoint参数,来获取目标对象和目标方法相关信息,但一定要保证必须是第一个参数。