Spring容器创建过程分析

导读:本篇文章讲解 Spring容器创建过程分析,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Spring容器的refresh()[创建刷新],
ioc容器就是一些Map;很多的Map里面保存了单实例Bean,环境信息

详细的知识和spring的其他原理请看我的博客:https://blog.csdn.net/wang121213145/article/details/123953486

1.prepareRefresh()刷新前的预处理;

  1. initPropertySources();初始化一些属性设置;子类自定义个性化的属性设置方法;
  2. getEnvironment().validateRequiredProperties();检验属性的合法等;
  3. this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的事件;

2.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();创建获得BeanFactory对象[DefaultListableBeanFactory];

3.prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)

  1. 设置BeanFactory的类加载器、支持表达式解析器
  2. 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
  3. 设置忽略的自动装配的接口【EnvironmentAware】
  4. 注册可以解析的自动装配;我们能直接在任何组件中自动注入【BeanFactory、ApplicationEventPublisher、…】
  5. 添加BEanPostProcessor【ApplicationListenerDetector】
  6. 添加编译时的AspectJ
  7. 给BeanFactory中注册一些能用的组件;【environment、…】

4.postProcessBeanFactory(beanFactory);子类通过重写这个方法在BeanFactory创建并预准备完成以后做进一步设置

5.invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor;
俩个接口:BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor

  1. 先执行BeanDefinitionRegistryPostProcessor的方法;
    获取所有的BeanDefinitionRegistryPostProcessor;优先执行实现PriorityOrdered接口的;然后执行实现Ordered接口的;最后执行剩下的
  2. 先执行BeanFactoryPostProcessor的方法;
    获取所有的BeanDefinitionRegistryPostProcessor;优先执行实现PriorityOrdered接口的;然后执行实现Ordered接口的;最后执行剩下的

6.registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器),不同接口类型的BeanPostProcessor,在Bean创建前后执行的时机是不一样的
BeanPostProcessor
DestructionAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor【internalPostProcessors】

  1. 获取所有的BeanostProcessor;先注册实现PriorityOrdered的;然后注册实现Ordered接口的;然后注册剩下的;最终注册MergedBeanDefinitionPostProcessor
  2. 注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是,则this.applicationContext.addApplicationListener((ApplicationListener<?>) bean)

7.initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定;消息解析)

  1. 获取BeanFactory
  2. 看容器中是否又id为messageSource的,类型是MessageSource的组件
    如果有赋值给messageSource ,如果没有自己创建一个DelegatingMessageSource;
    MessageSource:取出国际化配置文件中的某个key的值;能按区域信息获取;
  3. 把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;

8.initApplicationEventMulticaster();初始化事件派发器

9.onRefresh();留给子容器(子类),子类重写这个方法,在容器刷新的时候可以自定义逻辑;

10.registerListeners();给容器中将所有项目的ApplicationListener注册进来;

  1. 从容器中拿到所有的ApplicationListener;
  2. 将每个监听器添加到事件派发器中;getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  3. 派发之前步骤中产生的事件;

11.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;

  1. beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean

     1.获取容器中所有的Bean,依次进行初始化和创建对象
       2.获取Bean的定义信息;RootBeanDefinition
       3.Bean不是抽象的,是单实例,不是懒加载
       4.如果不是FactoryBean,利用getBean(beanName)创建对象。
       5.doGetBean();
       6.private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);先从获取缓存中保存的单实例Bean。如果能够获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
      7.缓存中获取不到,开始Bean的创建对象流程;
      8.标记当前bean已经被创建;
      9.获取Bean的定义信息;
     10.获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;
     11.启动bean的创建流程createBean(beanName,mbd,args);
     12.Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;InstantiationAwareBeanPostProcessors提前执行;先触发postProcessBeforeInstantiation();如果有返回值,触发postProcessAfterInitialization();
    
  2. InstantiationAwareBeanPostProcessors()如果没有返回Bean实例,继续下面流程;

  3. 调用applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

  4. 调用populateBean(beanName, mbd, instanceWrapper),对bean属性进行赋值;

  5. InstantiationAwareBeanPostProcessors()触发postProcessPropertyValues()

  6. 应用Bean属性的值;为属性利用setter方法进行复制;applyPropertyValues(beanName, mbd, bw, pvs);

  7. 【Bean初始化】initializationBean(beanName,exposedObject,mbd);

  8. 【执行Aware接口方法】invokeAwaremethods(beanName,bean);

  9. 【执行后置处理器初始化之前】wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

  10. 【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);是否是InitializingBean接口的实现;执行接口规定的初始化;是否自定义初始化方法;

  11. 【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

  12. 注册Bean的销毁方法;

  13. 将创建的Bean添加到缓存中singletonObjects;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75464.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!