Spring源码总结pt3——aop

在这里插入图片描述
关键技术:代理
在这里插入图片描述
所以其实使用aop的时候,已经使用的是target的代理类了,不是target了。

❓所以aop的功能也是BeanPostProcessor实现的?
答:是的✔️。反正aop是在finishbeanfactoryinitializer()中实现的。是的,后面有解答。BeanPostProcessor实现的aop代理。

aspectj

Spring就是使用了aspectj的语法风格 (其实就是用了它的注解) 。Spring aop是基于jdk动态代理或gclib的,是动态织入。aspectj好像不是?❔


aop源码/原理

知识点:后置处理器、aop原理、jdk动态代理

注意⚠️:这里讨论的aop原理、aop处理,其实就是ioc的结尾,bean初始化部分的微观过程。也就是refresh()函数中finish…()里面的微观过程。如下:
BeanDefinition ——> 普通java对象 ——> 真正的bean
关键技术:后处理器 + 代理 (jdk动态代理、GClib、aspectj)
  • ioc和aop的关系?

ioc和aop都是一个技术目标,和Spring无关。Spring只是用di实现了ioc、
在这里插入图片描述

  • 单纯使用ioc,得到的bean
    在这里插入图片描述
  • 使用了aspectj aop或者在BeanPostProcessor中使用了动态代理
    在这里插入图片描述
    已经是代理对象了,原来的对象丢了。名存实亡了

在这里插入图片描述
⚠️ ac.getbean(bean) 封装了半天其实就是一个map.get(bean),这个map就是DefaultSingletonBeanRegistry的单例池SingletonObjects是一个ConCurrentHashMap。

⚠️第一句applicationContext初始化的代码中,就调用了getBean(),印证了《spring4》书中“applicationContext启动就实例化所以bean,勤奋加载”。他意思是在applicationContext初始化过程中,看单例池bean有没有初始化,没有就帮他初始化。

⚠️所以下面第二句getBean()和第一句里面的getBean()是一同一个方法。

生成bean + proxy的核心代码

AbstractAutowireCapableBeanFactory

  1. doCreateBean()
  2. createBeanInstance():生成原生bean
    (执行9次后置处理器)
  3. initializeBean():原生bean变成了代理对象proxy
  4. applyBeanPostProcessorsAfterInitialization:原生bean变成了代理对象proxy

可以看出,aop是其实ioc(bean生命周期)的其中一段。
⚠️⚠️同时,完美印证了,aop的实现,就是在bean的生命周期初始化阶段,调用了后置处理器,把普通bean——>proxy。

总结:所以aop处理就是生产bean的一个环节,大概在refresh的finish…方法中,在把bean create出来后,bean还是一个普通java对象,然后调用一种proxy的bean后置处理器,通过proxy的factory,按条件从3种proxyfactory中拿到一种,比如jdkdynamic,对bean进行proxy的生产,最后返回的不是原来的bean,而是一个代理对象。
发布了17 篇原创文章 · 获赞 18 · 访问量 5561

猜你喜欢

转载自blog.csdn.net/Vincentqqqqqqq/article/details/104784790
今日推荐