Spring之AOP源码解析(中)

这篇具有很好参考价值的文章主要介绍了Spring之AOP源码解析(中)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在上一篇文章中,我们讲解了Spring中那些注解可能会产生AOP动态代理,我们通过源码发现,完成AOP相关操作都和ProxyFactory这个类有密切关系,这一篇我们将围绕这个类继续解析

演示

作用

ProxyFactory采用策略模式生成动态代理对象,具体生成cglib动态代理还是jdk动态代理,是根据我们具体设置的内容所决定的,我们分别演示一下生成cglib动态代理和jdk动态代理两种情况。具体细节可以详细阅读DefaultAopProxyFactory的createAopProxy方法

生成cglib动态代理

package com.test.aop.test;

public class CglibTarget {
    public void doObject() {
        System.out.println("CglibTarget doObject");
    }
}
package com.test.aop.test;

import org.springframework.aop.framework.ProxyFactory;

public class CglibProxy {

    public static void main(String[] args) {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTarget(new CglibTarget());
        CglibTarget proxy = (CglibTarget) proxyFactory.getProxy();
        proxy.doObject();
    }
}

Spring之AOP源码解析(中),spring,java,后端

我们可以发现最终是以cglib动态代理方式生成代理对象

 生成jdk动态代理

package com.test.aop.test;

public interface JdkTarget {
    void doObject();
}
package com.test.aop.test;

public class JdkTargetImpl implements JdkTarget {

    @Override
    public void doObject() {
        System.out.println("JdkTargetImpl doObject");
    }
}
package com.test.aop.test;

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.target.SingletonTargetSource;

public class JdkProxy {

    public static void main(String[] args) {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setInterfaces(JdkTarget.class);
        proxyFactory.setTargetSource(new SingletonTargetSource(new JdkTargetImpl()));
        JdkTarget proxy = (JdkTarget) proxyFactory.getProxy();
        proxy.doObject();

    }
}

Spring之AOP源码解析(中),spring,java,后端

我们可以发现最终是以jdk动态代理方式生成代理对象 

ProxyFactory源码解析

我们先观察一下ProxyFactory这个类的继承关系

Spring之AOP源码解析(中),spring,java,后端

我们以proxyFactory.getProxy()方法为切入口,进行源码解析 

Spring之AOP源码解析(中),spring,java,后端Spring之AOP源码解析(中),spring,java,后端Spring之AOP源码解析(中),spring,java,后端

对上述流程进行梳理,见下图Spring之AOP源码解析(中),spring,java,后端

我们分别查看两种方式的代理过程

jdk动态代理过程(JdkDynamicAopProxy)

Spring之AOP源码解析(中),spring,java,后端

jdk动态代理的过程比较简单主要就是利用Proxy.newProxyInstance方法创建代理对象 

cglib动态代理过程(CglibAopProxy) 

Spring之AOP源码解析(中),spring,java,后端Spring之AOP源码解析(中),spring,java,后端Spring之AOP源码解析(中),spring,java,后端

cglib动态代理主要利用我们自定义的ProxyFactory对象,然后根据设置的参数构建Enhancer对象,然后创建代理对象。我们需要注意的是代理对象一共有七个拦截器,spring会根据我们调用的方法,指定拦截器。比如我们调用equal方法就会经过EqualsInterceptor拦,调用hashCode方法就会调用HashCodeInterceptor,我们主要需要关注的就是DynamicAdvisedInterceptor,一般增强的方法都会经过这个拦截器。具体进入那个拦截器可以查看CglibAopProxy类的accept方法

ProxyFactory的重要属性Advisor

我们在前文中说到@EnableTransactionManagement,@EnableAspectJAutoProxy完成AOP动态代理都是依靠AbstractAutoProxyCreator的postProcessAfterInitialization方法中完成的,其中最主要的方法是wrapIfNecessary,我们查看相关源码

Spring之AOP源码解析(中),spring,java,后端

通过源码我们知道只有找到了增强点,spring才会进行动态代理

我们在上文中提到了@EnableTransactionManagement,@EnableAspectJAutoProxy两个注解的渊源,然后得出结论:如果同时存在,最终只能存在一个优先级更高的BeanPostProcessor(bpp)

那么@EnableAspectJAutoProxy这个注解注入了一个优先级更高的bpp,有什么扩展点呢?我们以上图中getAdvicesAndAdvisorsForBean方法为切入口进行分析

Spring之AOP源码解析(中),spring,java,后端

findCandidateAdvisors在两个注解注入的bpp的共同父类有一个默认实现,但是@EnableAspectJAutoProxy这个注解注入的bpp(AnnotationAwareAspectJAutoProxyCreator)重写了findCandidateAdvisors方法,重写的方法会对默认方法进行扩展

Spring之AOP源码解析(中),spring,java,后端

 总结

ProxyFactory这个类在Spring完成AOP动态代理的过程中起到了重要的作用,具体如下所述文章来源地址https://www.toymoban.com/news/detail-835040.html

  • 决定Spring进行aop动态代理的方式(jdk动态代理或者cglib动态代理)
  • 可以设置监听器,监听动态代理对象
  • 可以决定是否提前暴露代理对象(属性exposeProxy=true则会提前暴露)
  • 可以通过查找增强点,决定是否需要进行动态代理

到了这里,关于Spring之AOP源码解析(中)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【手撕Spring源码】AOP

    AOP 底层实现方式之一是代理,由代理结合通知和目标,提供增强功能 除此以外,aspectj 提供了两种另外的 AOP 底层实现: 第一种是通过 ajc 编译器在 编译 class 类文件时,就把通知的增强功能,织入到目标类的字节码中 第二种是通过 agent 在 加载 目标类时,修改目标类的字节

    2024年02月07日
    浏览(41)
  • Spring AOP 源码分析

    【阅读前提】: 需了解 AOP 注解开发流程:链接 在配置类中添加注解 @EnableAspectJAutoProxy ,便开启了 AOP (面向切面编程) 功能。此注解也是了解 AOP 源码的入口。 【1】 @EnableAspectJAutoProxy 是什么?我们进入注解,查看其源码如下:发现调用 EnableAspectJAutoProxy 类,同时使用 @

    2024年01月16日
    浏览(33)
  • 004-Spring AOP源码分析

    CGLIb 动态代理 Spring 统一封装 一个是继承,一个是实现,都有各自适用的场景 但是都是一个实例方法的增强 所以统一封装便于使用 屏蔽了底层的代理工具的切换 抽象了代理方法Advice 不需要再手动调用:被代理类(原型)的方法

    2024年02月14日
    浏览(43)
  • Spring之AOP源码(二)

    书接上文 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理,但是还没有涉及源码层面,这篇文章就深度分析一下SpringAOP的底层源码。 2. 知识点补充 TargetSource 在我们日常的AOP中,被代理对象就是Bean对象,是由BeanFactory给我们创建出来的,但是 Spring AOP中提供了

    2024年01月18日
    浏览(34)
  • 全面掌握Spring框架:深入解析IOC、AOP、事务管理与注解使用

    探索Spring框架的深层次知识,包括Spring IOC容器的初始化流程、AOP的实现机制、事务管理的细节、循环依赖问题的处理、条件注解的应用、JavaConfig的使用方法、PostProcessor的角色、@Autowired和@Value注解的高级应用,以及${}与#{}的区别。

    2024年03月13日
    浏览(196)
  • 深入解析Spring的IOC与AOP及其在项目中的应用

    在现代的软件开发中,为了提高代码的可维护性、可扩展性以及降低代码的耦合度,使用设计模式和面向切面编程(AOP)成为了程序员们常用的技术手段。Spring作为一个优秀的Java开发框架,提供了IOC和AOP两个核心特性,极大地简化了开发工作。本文将深入探讨Spring的IOC和AO

    2024年02月13日
    浏览(51)
  • Java spring Aop实战

    Spring AOP 1. 实战 1.实战 创建工程和依赖 数据库建表 实体类 Mapper 接口 方法一 方法二 Service 包 接口1: 实现接口 Mapper Mapper 1 Mapper 2 配置xml文件 Xml 1 Xml 2 Spring 配置文件 Mybatis配置文件 测试类 数据库结果 测试2 测试3 不符合业务逻辑,加入事物 头文件 只能在service实现类加 重

    2024年02月15日
    浏览(38)
  • 设计模式 代理模式(静态代理 动态代理) 与 Spring Aop源码分析 具体是如何创建Aop代理的

    代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对真实对象的访问。这种模式可以用于提供额外的功能操作,或者扩展目标对象的功能。 在代理模式中,代理对象与真实对象实现相同的接口,以便在任何地方都可以使用相同的接口来调用真实对象的方法。这

    2024年01月20日
    浏览(43)
  • 8.1Java EE——Spring AOP

            Spring的AOP模块是Spring框架体系中十分重要的内容,该模块一般适用于具有横切逻辑的场景,如访问控制、事务管理和性能监控等 一、AOP概述         AOP的全称是Aspect Oriented Programming,即面向切面编程。和OOP不同,AOP主张将程序中相同的业务逻辑进行横向隔离,

    2024年02月16日
    浏览(43)
  • Java EE 突击 14 - Spring AOP

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包