AOP

aop的方式:

  1. 静态代理 : 直接修改原类,比如编译期生成代理类的 APT。
  2. 自定义类加载器:使用类加载器启动自定义的类加载器,并加一个类加载监听器,监听器发现目标类被加载时就织入切入逻辑,以 Javassist 为代表。
  3. 动态代理:字节码加载后,为接口动态生成代理类,将切面植入到代理类中,以 JDK Proxy 为代表。
  4. 动态字节码生成:字节码加载后,通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用织入逻辑。属于子类代理,以 CGLIB 为代表。
  5. 1、2为静态织入;3,4为动态织入。

AspectJ代理方式:

  1. 基于注解
    1. @Aspect
    2. @Pointcut 切入点
    3. @Before
    4. @After
    5. @Around 需要手动调用:joinPoint.proceed();
  2. 织入方式:
    1. ajc编译,编译期将切面织入业务代码中。
    2. aspectjweaver.jar 的agent代理,在类加载期间织入切面。
    3. 两者的优缺点:a方式,在反编译时,会看到织入的切面代码?

Spring AOP 动态代理

  1. 原理:采用截取的方式,对被代理类进行装饰,以取代原有对象的行为,不会产生新类。
  2. 使用AspectJ 的注解,但是织入时使用JDK或CGLib(可选配置),因此Spring AOP不是静态代理,而是动态代理。
  3. 缺点:不能修改对象字段;不支持构造器连接点,即无法在Bean创建时添加代理动作。(AspectJ可以)

使用Spring AOP

  1. maven

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
  2. 切面类上添加 @Aspect

  3. 切面类中,对应的方法上使用:@Before,@After,@Around......

  4. 切面类中,对应的方法上配置execution或@annotation

  5. 配置类中开启代理 @EnableAspectJAutoProxy

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 目录 1. Web MVC发展史历程2.Spring概要3.Spring-依赖注入概要(IOC)4.属性注入的三种...
    唯老阅读 1,758评论 0赞 3
  • 一、概要 Spring加入了对AOP编程支持,利用AOP的思想结合Spring的一些API可以实现核心业务与辅助业...
    任未然阅读 424评论 0赞 1
  • AOP-面向切面编程 AOP是对OOP的有益补充,面向对象的特点是继承、多态和封装。而封装就要求将功能分散...
    浅时光_love阅读 376评论 0赞 2
  • Spring AOP 主要内容 代理模式 ​ 代理模式在 Java 开发中是一种比较常见的设计模式。设计目的旨在为...
    一纸油伞阅读 216评论 0赞 0
  • 前言 我们在前面学习了动态代理机制,Spring的AOP正是应用此机制实现的,下面我们来学习如何来配置Spring...
    千锋陈老师阅读 404评论 1赞 0

友情链接更多精彩内容