AOP

AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

目前已有的几款AOP框架技术:

  • AspectJ:基于源代码和字节码解包的一个编织器,用户需要使用的时候用到一门新的语言,因此Spring的Aop对AspectJ进行了一次封装。
  • AspectWerkz:AOP 框架,使用字节码动态编织器和 XML 配置
  • JBoss-AOP:基于拦截器和元数据的 AOP 框架,运行在 JBoss 应用服务器上,以及 AOP 中用到的一些相关技术实现
  • Javassist:Java 字节码操作类库,JBoss 的一个子项目

Aspect(切面)==》【可以理解为是将业务代码抽出来的一个类】

@Aspect
public class LogAspect {
  /** ... 这里面是相关方法的部分 省略大部分内容 ... **/
}

 

JoinPoint(连接点)

 

 Spring框架目前只支持方法级别的拦截,其实aop的连接点还可以有多种方式,例如说参数,构造函数等等。

 

PointCut(切入点)===》可以理解为对各个连接点进行拦截

 

 

 

Advice(通知)====》指拦截到连接点之后需要执行的代码

分为了前置,后置,异常,环绕,最终

 

 

 

cglib和jdk代理

cglib的代理模式和jdk实现的代理技术本质还是会有较大差异性,jdk要求被代理对象需要实现jdk内部的InvocationHandler接口才能进行接口回调操作,但是cglib对是否实现接口方面没有强制要求,而且其性能也比JDK自带的代理要高效许多。

 

(1)首先需要定义相关的注解:

package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @Author linhao
 * @Date created in 3:49 下午 2021/5/6
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Pointcut {
    String value() default "";
}

 

 

package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @Author linhao
 * @Date created in 3:42 下午 2021/5/6
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Before {
    String value();
}

 

package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @Author linhao
 * @Date created in 3:43 下午 2021/5/6
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface After {
    String value();
}

package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @Author linhao
 * @Date created in 3:41 下午 2021/5/6
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Aspect {
    String value() default "";
}

 

package org.idea.spring.aop.version1.aspect;
import org.idea.spring.aop.version1.annotation.After;
import org.idea.spring.aop.version1.annotation.Aspect;
import org.idea.spring.aop.version1.annotation.Before;
import org.idea.spring.aop.version1.annotation.Pointcut;
import java.lang.reflect.Method;
/**
 * 切面
 *
 * @Author linhao
 * @Date created in 3:43 下午 2021/5/6
 */
@Aspect
public class MyAspect {
    @Pointcut("org.idea.spring.aop.version1.test.*.*(..)")
    public void pointCut(){
    }
    @Before("pointCut()")
    public void doBefore(Method method, Object object){
        System.out.println("doBefore");
    }
    @After("pointCut()")
    public void doAfter(Method method, Object object){
        System.out.println("doAfter");
    }
}

posted @ 2021-05-12 20:30  KLAPT  阅读(77)  评论(0编辑  收藏  举报