核心类&方法

BeanDefinition

Bean的定义信息,封装bean的基本信息,从中可以获取类名、是否是单例、是否被注入到其他bean中、是否懒加载、bean依赖的bean的名称等。

Aware

继承Aware的bean可以感知到他在容器中的一些属性,如获取bean在容器中的ID,甚至获取到容器等。

BeanPostProcessor

Bean的后置处理器,可在bean的创建、初始化等阶段的前后对bean进行增强处理等。

BeanFactory

以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

是访问容器的顶层接口,他的实现类中会有一个MAP,用于存储bean的BeanDefinition。

(与FactoryBean区别:实现FactoryBean接口也是在容器中注入bean的方式之一,但它不是一个普通的bean,而是生成指定bean的一个工厂)

AbstractAutowireCapableBeanFactory:: populateBean(..)

DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory

此方法用于给bean注入依赖的其他bean

BeanWrapper

将交于容器管理的bean装饰,屏蔽多样性,统一的set、get方法,方便统一操作

核心流程源码

AnnotationAwareAspectJAutoProxyCreator创建过程

AOP核心类:AnnotationAwareAspectJAutoProxyCreator,本质是一种BeanPostProcessor

容器启动时:

==》 org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.Class<?>...)
  register(annotatedClasses);//加载、注册配置类;配置类也是一个被容器管理的bean
  refresh();//刷新容器,注册、创建相关bean
==》 org.springframework.context.support.AbstractApplicationContext#refresh
 // Register bean processors that intercept bean creation.
  registerBeanPostProcessors(beanFactory);//注册容器需要的核心BeanPostProcessor
  // Instantiate all remaining (non-lazy-init) singletons.
  finishBeanFactoryInitialization(beanFactory);//创建并初始化其他非懒加载的bean,主要是业务类bean
==》 org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors
==》 org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, org.springframework.context.support.AbstractApplicationContext)
  // Separate between BeanPostProcessors that implement PriorityOrdered, Ordered, and the rest.
  //根据继承的order等级,顺序创建BeanPostProcessor
  //AnnotationAwareAspectJAutoProxyCreator实现了Order
  //创建
  BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  //添加到容器-FactoryBean中
  org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List<org.springframework.beans.factory.config.BeanPostProcessor>)
==》 org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class<T>)
==》 org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean//BeanPostProcessor和业务Bean都用此创建bean
  //创建bean
  return createBean(beanName, mbd, args);
==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
  // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
  //有一次通过代理直接返回对象的机会,但一般都不会走到此方法中
  Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  //创建过程
  Object beanInstance = doCreateBean(beanName, mbdToUse, args);
==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
  //创建Bean,通过Wrapper装饰
  if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
  }
  // Initialize the bean instance.
  //填充bean后初始化bean
  Object exposedObject = bean;
  try {
  populateBean(beanName, mbd, instanceWrapper);
  if (exposedObject != null) {
  exposedObject = initializeBean(beanName, exposedObject, mbd);
  }
  }
==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
  //初始化bean
  //检查实现了哪些aware,并注入相应的值
  invokeAwareMethods(beanName, bean);
  //BeanPostProcessor初始化前置处理
  wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  //调用bean的初始方法
  invokeInitMethods(beanName, wrappedBean, mbd);
  //BeanPostProcessor初始化后置处理
  wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
==》 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
  //此类做Bean初始化的后置处理,若bean有advice则创建proxy bean,此bean无。

业务Bean(proxy)创建过程

容器启动时:

==》 org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.Class<?>...)
  register(annotatedClasses);//加载、注册配置类;配置类也是一个被容器管理的bean
  refresh();//刷新容器,注册、创建相关bean
==》 org.springframework.context.support.AbstractApplicationContext#refresh
 // Register bean processors that intercept bean creation.
  registerBeanPostProcessors(beanFactory);//注册容器需要的核心BeanPostProcessor
  // Instantiate all remaining (non-lazy-init) singletons.
  finishBeanFactoryInitialization(beanFactory);//创建并初始化其他非懒加载的bean,主要是业务类bean
==》 org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
  // Instantiate all remaining (non-lazy-init) singletons.
  beanFactory.preInstantiateSingletons();
==》 org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons
  //getBean(beanName);
==》 org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
==》 org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
  return createBean(beanName, mbd, args);
==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
  Object beanInstance = doCreateBean(beanName, mbdToUse, args);
  //创建Bean,通过Wrapper装饰
  if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
  }
  // Initialize the bean instance.
  //填充bean后初始化bean
  Object exposedObject = bean;
  try {
  populateBean(beanName, mbd, instanceWrapper);
  if (exposedObject != null) {
  exposedObject = initializeBean(beanName, exposedObject, mbd);
  }
  }
==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
  //初始化bean
  //检查实现了哪些aware,并注入相应的值
  invokeAwareMethods(beanName, bean);
  //BeanPostProcessor初始化前置处理
  wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  //调用bean的初始方法
  invokeInitMethods(beanName, wrappedBean, mbd);
  //BeanPostProcessor初始化后置处理
  wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
  //此类做Bean初始化的后置处理,若bean有advice则创建proxy bean
  //遍历bean的后置处理器,并做后置处理
  //当后置处理器时AnnotationAwareAspectJAutoProxyCreator时进入方法,判断是否需要做代理
  for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
  result = beanProcessor.postProcessAfterInitialization(result, beanName);
  if (result == null) {
  return result;
  }
  }
==》 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
==》 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
  // Create proxy if we have advice.
  Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
  if (specificInterceptors != DO_NOT_PROXY) {
  this.advisedBeans.put(cacheKey, Boolean.TRUE);
  Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
  this.proxyTypes.put(cacheKey, proxy.getClass());
  return proxy;
  }
==》 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy
  //bean需要被aop做代理进行增强时进入此方法
  //取得bean对应的advisors,advisors会被封装成链式Interceptors(责任链模式)供后期增强使用
  Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
  //使用代理工厂创建代理
  return proxyFactory.getProxy(getProxyClassLoader());
==》 org.springframework.aop.framework.ProxyFactory#getProxy(java.lang.ClassLoader)
  return createAopProxy().getProxy(classLoader);
==》 org.springframework.aop.framework.ProxyCreatorSupport#createAopProxy
  return getAopProxyFactory().createAopProxy(this);
==》 org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy
  //如果继承自接口使用JDK动态代理
  if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
  return new JdkDynamicAopProxy(config);
  }
  //否则使用CGLib动态代理
  return new ObjenesisCglibAopProxy(config);

Bean的创建梳理

包括工具Bean、业务Bean

1、bean在缓存中(Map)是否存在,存在则直接返回,不存在进入创建流程

2、创建BeanPostProcessor后置处理器

是否实现Aware,实现则注入对应容器信息

3、创建自身bean

创建àpopulateBeanàInvoke InitMethod(若有advice此时创建proxy)

AOP advice过程

在业务方法中加断点,调试进入

==》 org.springframework.aop.framework.JdkDynamicAopProxy#invoke
  //当被代理类实现了接口时使用jdk动态代理
  // Get the interception chain for this method.
  //获取通知封装成的链
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
  // We need to create a method invocation...
  invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
  // Proceed to the joinpoint through the interceptor chain.
  //容器在封装advisors成Interceptors时会进行排序,此顺序和实际执行顺序相反,因为Interceptors会以责任链的形式调用,因此实际执行时顺序是正常的
  retVal = invocation.proceed();

AOP 方法增强梳理

1、创建AOP核心类:AnnotationAwareAspectJAutoProxyCreator

2、在注入时,CreateBean时,检查是否有Advice,如果有则创建bean的代理。

注意:代理类对象(proxy)会加入容器,但Context::BeanFactory::BeanDefinition中的定义信息仍是被代理类的,所以取到的name也是被代理类的。

代理类会在被代理类调用populateBean 、InitMethod后创建,

3、被增强的方法在调用时,会调用代理类的方法,方法中获取相应通知做增强处理。这些通知会被封装成MethodInterceptor,对切点进行拦截增强处理。

Spring源码分析笔记--AOP的更多相关文章

  1. Spring源码分析之AOP从解析到调用

    正文: 在上一篇,我们对IOC核心部分流程已经分析完毕,相信小伙伴们有所收获,从这一篇开始,我们将会踏上新的旅程,即Spring的另一核心:AOP! 首先,为了让大家能更有效的理解AOP,先带大家过一 ...

  2. spring源码分析(二)Aop

    创建日期:2016.08.19 修改日期:2016.08.20-2016.08.21 交流QQ:992591601 参考资料:<spring源码深度解析>.<spring技术内幕&g ...

  3. 【Spring源码分析】AOP源码解析(上篇)

    前言 前面写了六篇文章详细地分析了Spring Bean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析.为了探究AOP实现原理,首先定义几个类,一个Dao接口: pub ...

  4. Spring源码分析之AOP

    1.AOP简介 AOP即面向切面编程(Aspect Oriented Programming),通过预编译方式及运行期动态代理实现程序功能的统一维护的一种技术.使用aop对业务逻辑的各个部分进行隔离, ...

  5. 【Spring源码分析】AOP源码解析(下篇)

    AspectJAwareAdvisorAutoProxyCreator及为Bean生成代理时机分析 上篇文章说了,org.springframework.aop.aspectj.autoproxy.A ...

  6. Spring源码分析笔记--事务管理

    核心类 InfrastructureAdvisorAutoProxyCreator 本质是一个后置处理器,和AOP的后置处理器类似,但比AOP的使用级别低.当开启AOP代理模式后,优先使用AOP的后置 ...

  7. Spring源码分析之`BeanFactoryPostProcessor`调用过程

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...

  8. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

  9. Spring源码分析之循环依赖及解决方案

    Spring源码分析之循环依赖及解决方案 往期文章: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostPro ...

随机推荐

  1. 【C#硬件角度理解代码】函数

    函数的执行过程

  2. javascript中逻辑运算符&&和||的返回值问题

    今天在做逻辑运算符的时候遇到一个小问题一直转不过弯来,var a=(undefined&&123)||(3||5)的返回值是什么? 首先是||的返回值问题: ||的返回值会返回最早遇到 ...

  3. 用python构建一个多维维数组

    用python构建一个二维数组 解法? 方法1: num_list=[0]*x//表示位创建一个一维数组为num_lis[x],且数组中的每一项都为0 num_list=[[0]*x for i in ...

  4. Python:datetime

    学习自:datetime - Basic date and time types - Python 3.10.0b2 documentation datetime模块用于操作date和time. da ...

  5. vue electron 运行时报错Cannot find module 'fs/promises'的解决方法

    项目已经上线半年了,全省多地使用,突然出现的问题,最后发现是因为使用的 electron-updater 因为版本号没有锁定,突然之间就报了上面的错误,不管我怎么升级node都没用(哈哈,node本身 ...

  6. oracle 中的decode函数

    decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN ...

  7. pep9伪代码

    Set sum to 0 Read num 1 Set sum to sum + num1 Read num2 Set sum to sum + num2 Read num3 Set sum to s ...

  8. 实践2:如何使用word2vec和k-means聚类寻找相似的城市

    理解业务 一个需求:把相似的目的地整理出来,然后可以通过这些相似目的地做相关推荐,或者是相关目的地的推荐 准备数据 Word2Vec算法:可以学习输入的文本,并输出一个词向量模型 对数据进行清洗,去出 ...

  9. 一比一还原axios源码(二)—— 请求响应处理

    上一章,我们开发了一些简单的代码,这部分代码最最核心的一个方法就是buildURL,应对了把对象处理成query参数的方方面面.虽然我们现在可以发起简单的请求了,但是第一,我们无法接收到服务器的响应, ...

  10. web自动化之selenium(三)文件上传

    1.上传标签为input #若上传文件的标签为<input>可以直接定位标签,然后send_keys(文件路径)可以直接上传 2.利用第三方软件Autoit上传 1.下载Autoit:ht ...