本文是学习《Spring 手撸专栏》第 10 章笔记,主要记录我的一些debug调试过程,方便后期复习。具体学习,大家可以去看一下这个专栏,强烈推荐。

方案

其实在有了AOP的核心功能实现后,把这部分功能服务融入到 Spring 其实也不难,只不过要解决几个问题,包括:怎么借着 BeanPostProcessor 把动态代理融入到 Bean 的生命周期中,以及如何组装各项切点、拦截、前置的功能和适配对应的代理器。整体设计结构如下图:

  • 为了可以让对象创建过程中,能把xml中配置的代理对象也就是切面的一些类对象实例化,就需要用到 BeanPostProcessor 提供的方法,因为这个类的中的方法可以分别作用与 Bean 对象执行初始化前后修改 Bean 的对象的扩展信息。但这里需要集合于 BeanPostProcessor 实现新的接口和实现类,这样才能定向获取对应的类信息。
  • 但因为创建的是代理对象不是之前流程里的普通对象,所以我们需要前置于其他对象的创建,所以在实际开发的过程中,需要在 AbstractAutowireCapableBeanFactory#createBean 优先完成 Bean 对象的判断,是否需要代理,有则直接返回代理对象。在Spring的源码中会有 createBean 和 doCreateBean 的方法拆分
  • 这里还包括要解决方法拦截器的具体功能,提供一些 BeforeAdvice、AfterAdvice 的实现,让用户可以更简化的使用切面功能。除此之外还包括需要包装切面表达式以及拦截方法的整合,以及提供不同类型的代理方式的代理工厂,来包装我们的切面服务。

debug调试

因为创建的是代理对象不是之前流程里的普通对象,所以我们需要前置于其他对象的创建,所以在实际开发的过程中,需要在 AbstractAutowireCapableBeanFactory#createBean 优先完成 Bean 对象的判断,是否需要代理,有则直接返回代理对象。
AbstractAutowireCapableBeanFactory.java

 protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {Object bean = null;try {// 判断是否返回代理 Bean 对象bean = resolveBeforeInstantiation(beanName, beanDefinition);if (null != bean) {return bean;}// 实例化 Beanbean = createBeanInstance(beanDefinition, beanName, args);...}...}

AbstractAutowireCapableBeanFactory.java

protected Object resolveBeforeInstantiation(String beanName, BeanDefinition beanDefinition) {Object bean = applyBeanPostProcessorsBeforeInstantiation(beanDefinition.getBeanClass(), beanName);if (null != bean) {bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}return bean;}


AbstractAutowireCapableBeanFactory.java

protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {for (BeanPostProcessor beanPostProcessor : getBeanPostProcessors()) {if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {Object result = ((InstantiationAwareBeanPostProcessor) beanPostProcessor).postProcessBeforeInstantiation(beanClass, beanName);if (null != result) return result;}}return null;}

DefaultAdvisorAutoProxyCreator.java

public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if (isInfrastructureClass(beanClass)) return null;Collection<AspectJExpressionPointcutAdvisor> advisors = beanFactory.getBeansOfType(AspectJExpressionPointcutAdvisor.class).values();for (AspectJExpressionPointcutAdvisor advisor : advisors) {ClassFilter classFilter = advisor.getPointcut().getClassFilter();if (!classFilter.matches(beanClass)) continue;AdvisedSupport advisedSupport = new AdvisedSupport();TargetSource targetSource = null;try {targetSource = new TargetSource(beanClass.getDeclaredConstructor().newInstance());} catch (Exception e) {e.printStackTrace();}advisedSupport.setTargetSource(targetSource);advisedSupport.setMethodInterceptor((MethodInterceptor) advisor.getAdvice());advisedSupport.setMethodMatcher(advisor.getPointcut().getMethodMatcher());advisedSupport.setProxyTargetClass(false);//这里面会调用代理方法。return new ProxyFactory(advisedSupport).getProxy();}return null;}

[Spring手撸专栏学习笔记]——把AOP动态代理,融入到Bean的生命周期相关推荐

  1. Spring in Action 4th 学习笔记 之 AOP

    前提:本文中的AOP仅限于Spring AOP. 先说说为什么需要AOP 最简单的一个例子就是日志记录,如果想记录一些方法的执行情况,最笨的办法就是修改每一个需要记录的方法.但这,真的很笨... 好的 ...

  2. 【Mybatis学习笔记】Mapper动态代理四项原则和注意事项

    如果使用原始的DAO,要自己对其进行实现,而如果使用Mybatis的Mapper动态代理,就可以让Mybatis自动帮你实现DAO接口. Mapper动态代理的四项原则 1.接口方法名需要与Mappe ...

  3. Spring源码学习--Bean的生命周期

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  4. Spring Bean的生命周期(非常详细)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  5. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringA ...

  6. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

  7. Spring之完整版学习笔记

    文章目录 Spring 概述(Spring文章整合) 1. Spring 简介 2. Spring 优势 3. Spring 的核⼼结构 Spring 核心思想 Spring IOC 1. IOC是什 ...

  8. Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式

    上一篇文章<Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍>主要是介绍了OAuth2协议的基本内容以及Spring ...

  9. Spring Security技术栈学习笔记(八)Spring Security的基本运行原理与个性化登录实现

    正如你可能知道的两个应用程序的两个主要区域是"认证"和"授权"(或者访问控制).这两个主要区域是Spring Security的两个目标."认证&qu ...

最新文章

  1. mariadb mysql 5.6_MySQL / MariaDB 5.5 升级到 MySQL 5.6
  2. 无法从外部连接MySQL_无法从外部VPC连接到RDS实例(ERROR 2003(HY000)无法连接到MySQL服务器)...
  3. 韩国女主播被中国土豪打赏13万 差点吓晕!网友:真是没见过世面
  4. C++设计模式详解之适配者模式解析
  5. ylbtech-LanguageSamples-Struct(结构)
  6. Mysql删除数据时出现执行很慢并且删除失败--线程堵塞
  7. java中的控制执行流程
  8. ansible远程在Windows server 2012 R2 安装vcredist(2008 2010 2012 2013)
  9. 20道常见的kafka面试题以及答案
  10. 步道乐跑(最新版本)
  11. mysql 删除不了库
  12. 大数据解决方案:Hadoop监控
  13. Use Ant implementing Continous Integration.
  14. 虚拟机没关电脑直接关机了,重启后crt、xshell都连不上虚拟机
  15. 【最优化问题】方法总结
  16. 群签名和环签名的区别_环签名,聚合签名
  17. C#之:线程同步 Monitor类
  18. SCADA系统一次系统与二次系统模型
  19. matlab 均值中心化,数据预处理之中心化(零均值化)与标准化(归一化)
  20. java实现简单的收银员系统

热门文章

  1. Java实现mysql保存微信特殊表情符号
  2. Cocos2d-x 游戏中子弹的设计 (一)
  3. 快速学习-RocketMQ-“Request-Reply”特性
  4. 机器学习笔记——模型选择与正则化
  5. 传动系统结构简图_输送带传动结构简图大全
  6. C#之HC-05蓝牙配对助手
  7. rtx3060ti参数配置
  8. Python-Flask开发微电影网站(一)
  9. 初心勿忘,只做真我!
  10. 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)