spring-aop
1.概述
spring-aop是一个面向切面的中间件,是对oop的完善和补充。
2.基本概念
(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
首先config通过将配置转化为BeanDefinetion,BeanDefinetion可以直接产生bean,bean主要是切面和目标
然后切面被封装成Advisor,切面的元素就是Advice,方法本身被封装成interceptor,interceptor本书就是一种advice且可执行。外部定义的interceptor可以通过适配器定义为advisor,
最后代理工厂将Advisor和TargetSource封装成最终的代理。pointcut用于匹配可执行的点,它包含了methodMatcher和classFilter的实现。Advisor之中就包含了pointcut属性,用于判断一个方法是否应该执行该advisor的advice。
也就是配置产生了多个advisor,advisor通过pointcut的匹配产生了advice,advice用于构造了代理,代理通过运行advice来完成整个aop的流程。
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; //日志切面类 @Aspect public class LogAspects { @Pointcut("execution(public int Demo.*(..))") public void pointCut(){}; @Before("pointCut()") public void logBefore(){ System.out.println("before"); } @After("pointCut()") public void logAfter(){ System.out.println("after"); } @AfterReturning("pointCut()") public void logReturn(){ System.out.println("return"); } @AfterThrowing("pointCut()") public void logException(){ System.out.println("error"); } @Around("pointCut()") public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("before"); Object obj = proceedingJoinPoint.proceed(); System.out.println("after"); return obj; } }
@Configuration
@EnableAspectJAutoProxy
public class Demo {
@Bean
public Demo demo(){
return new Demo();
}
}