当前位置: 首页 > news >正文

【Spring6源码・AOP】代理对象的创建

前三篇Spring IOC的源码解析与这一章的AOP是紧密相连的:

  1. 【Spring6源码・IOC】BeanDefinition的加载

  2. 【Spring6源码・IOC】Bean的实例化

  3. 【Spring6源码・IOC】Bean的初始化 - 终结篇

首先介绍我们本章的demo:

一个接口,一个实现,一个切面,一个测试类。

public interface TestInterface {

    void hello();
}
@Component
public class TestImpl implements TestInterface {

    @Override
    public void hello() {
        System.out.println("hello,world!");
    }
}

@Aspect
public class AspectJTest {

    @Pointcut("execution(* *.hello(..))")
    public void test(){}

    @Before("test()")
    public void before(){
        System.out.println("before test..");
    }

    @After("test()")
    public void after(){
        System.out.println("after test..");
    }

    @Around("test()")
    public Object around(ProceedingJoinPoint p){
        System.out.println("Around before1");
        Object o = null;
        try {
            o = p.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("Around after1");
        return o;
    }
}
@SpringBootTest
public class test {

    @Autowired
    private TestInterface test;
    
    @Test
    public void testData(){
        test.hello();
    }
}

前几章bean实例化之后,我们对bean进行了属性填充,紧接着就会调用initializeBean()方法返回该bean的代理对象,如果不需要被代理,那么就会直接返回该bean。最后无论返回的是代理对象还是原始对象,都会将其存进一级缓存中。


首先我们看看是如何创建代理对象的。

步入initializeBean方法,applyBeanPostProcessorsAfterInitialization方法就是用来生成代理对象,

在这里插入图片描述
步入applyBeanPostProcessorsAfterInitialization方法,在这个方法里面,循环遍历所有 BeanPostProcessor,调用它的 postProcessAfterInitialization 方法做后置处理。其中,用于生成代理对象的,就是 AnnotationAwareAspectJAutoProxyCreator

在这里插入图片描述
步入postProcessAfterInitialization 方法中,真正做事的是wrapIfNecessary方法,包装成代理对象。
在这里插入图片描述

步入wrapIfNecessary方法,会在里面根据我们的切面配置,获取对应的通知器。

在这里插入图片描述
然后就是调用 createProxy 方法创建代理对象,这里做了一个判断,如果这个bean包含一些切面的配置,那么就会调用createProxy对bean创建代理。
在这里插入图片描述
步入createProxy方法中,最终会调用buildProxy方法来完成代理的创建。
在这里插入图片描述

会经过一下几步,然后通过proxyFactory获取代理。

在这里插入图片描述

步入getPoxy方法,首先会创建代理器。得到一个aop代理工厂,用它去创建一个aop代理。
在这里插入图片描述
步入createAopProxy,这里会决策aop到底是用JDK动态代理还是cglib代理。

如果这个bean是接口的话,会使用Jdk动态代理。因为我们这里的bean是testImpl,所以,我们这里使用的是cglib代理。

在这里插入图片描述
创建完代理器,就回去创建代理类,步入如下方法:createAopProxy()

在这里插入图片描述
最终会调用buildProxy()方法,构建代理类和代理对象。

最终创建的方法有点深,大家请看。

在这里插入图片描述
步入===
在这里插入图片描述
步入===
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上创建完了代理对象,最后再把代理对象存进一级缓存。

在这里插入图片描述
在这里插入图片描述
最终,会真正的执行我们的目标方法,但是步入该方法,会进入cglib代理类的拦截方法。我们下一节好好聊聊这块。

在这里插入图片描述

cglib代理类
在这里插入图片描述

相关文章:

  • 农业局网站建设方案/搜易网服务介绍
  • 闵行区新闻网网站/手机app安装下载
  • 计算机系部网站开发背景/重庆网络推广
  • 国际物流网站模板/站长工具域名查询
  • 做外汇必须要网站/百度投诉中心24小时电话
  • 做高端网站的网络公司/网络营销一般月薪多少
  • Barra模型因子的构建及应用系列二之Beta因子
  • 一个关于image访问图片跨域的问题
  • 【关于Linux中----进程间通信方式之system V共享内存】
  • 【云原生进阶之容器】第五章容器运行时5.1节--容器运行时总述
  • 自动化 | 这些常用测试平台,你们公司在用的是哪些呢?
  • 【MySQL】深入学习B+索引的使用
  • Anaconda安装、opencv环境配置、jupyter notebook使用虚拟环境
  • 喜讯!酷开科技荣获中国国际广告节三项殊荣!
  • Windows下IIS部署网站流程
  • 多巴胺聚乙二醇多巴胺,Dopamine-PEG-Dopamine简介,多巴胺是具有正性肌力活动的单胺化合物
  • 区块链技术5--BTC网络
  • 系分 - 案例分析 - 架构设计(基本)