Spring AOP
Spring AOP
面向切面编程。
解决问题:解决进行事务处理、日志记录等操作时同样的代码分散到各个方法中。增加开发人员的工作量,提高了代码的出错率。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
关键词
切面(Aspect)
切面是一个包含通知和切点的对象,通知(即增强)和切点的结合。主要用来维护切点和通知之间的关系。AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中。AOP的工作重心在于如何将增强织入目标对象的连接点上,。可以简单地认为, 使用 @Aspect 注解的类就是切面.
连接点(Join Point)
在应用执行过程中能够插入切面的一个点。(注:就是抽象的「切点」声明所指代的那些具体的点。)可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。
切点(point cut)
切点(Pointcut ):一组连接点的总称,用于指定某个增强应该在何时被调用。提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice .Pointcut 通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut 当做jointpoint的集合
advice 是在 Join point 上执行的, 而 point cut 规定了哪些Join point可以执行哪些 advice
通知(Advice)
指拦截到连接点后要执行的代码,包括 @Before、@AfterReturning、@AfterThrowing、@After 和 @Around 五种类型。
织入(Weaving)
将切面应用到目标对象来创建新的代理对象的过程。在 Spring AOP 中,织入可以在编译时、类加载时和运行时进行。
核心注解
- @Aspect:定义一个切面
- @PointCut:定义切点
- @Before:定义前置通知
- @AfterReturning:定义后置通知
- @Around:定义环绕通知
- @AfterThrowing:定义异常通知来处理程序中未处理的异常
- @After:定义最终final通知
- @DeclareParent:定义引介通知
原理
AOP的实现原理是动态代理,动态代理可以由Jdk动态代理或者Cglib动态代理实现,调用需要增强的方法,实际上是调用了代理类的方法,由代理类执行业务逻辑。
jdk 代理
一种基于接口的代理,通过实现 InvocationHandler 实现对代理类方法的调用。只能代理实现了接口的类,在运行时通过生成代理类的方式来实现。
cglib字节码增强
基于继承的代理,通过生成代理类来完成对目标对象方法的调用。CGLIB 代理不需要实现接口,对目标对象进行继承并重写其中的方法,从而实现对方法的调用拦截。
java代理