zoukankan      html  css  js  c++  java
  • Spring源码解析(二)--Spring Bean创建

    Spring容器获取Bean和创建Bean都会调用getBean()方法

    getBean() --> doGetBean()
    1.transformedBeanName(name);获取beanName,可能存在别名(aliasMap)
    2.getSingleton(beanName);从缓存(singletonObjects)中获取,若存在则返回
    3.获取容器的父容器,若存在父容器并且当前Bean定义不存在当前容器中,则尝试从父容器中获取
    4.getMergedLocalBeanDefinition(beanName);获取Bean的Bean定义,并校验是否为抽象类
    5.从Bean中获取依赖的Bean(dependsOn),若存在,则先创建依赖的Bean,创建方式即当前过程getBean()
    6.创建singletion,调用getSingleton()->createBean(),在创建前后会修改各种容器中的值,防止重复创建或冲突等情况
    7.创建prototype,调用createBean(),在创建前后会修改各种容器中的值,防止重复创建或冲突等情况
    8.创建其他scope(request,session)。创建时会在request中或session中获取,获取不到调用createBean(),在创建前后会修改各种容器中的值,防止重复创建或冲突等情况

    createBean()
    1.resolveBeanClass(mbd, beanName);获取Bean的类型
    2.调用后置处理器InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(beanClass, beanName)方法
      若后置处理器返回对象,则调用后置处理器InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(beanClass, beanName)方法,并返回对象
      该后置处理器的作用是在对象创建前,给一个创建代理的机会,AOP的实现就是用来该方式。
    3.调用真正的创建方法doCreateBean(beanName, mbdToUse, args);
    4.调用后置处理器SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors(beanClass, beanName)方法,用于获取构造器
    5.如果获取到构造器,则用当前构造器创建对象,若获取不到则使用无参构造器创建instantiateBean(beanName, mbd),到此Bean已创建但未初始化
    6.调用后置处理器MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName)方法
    7.populateBean(beanName, mbd, instanceWrapper);填充Bean,设置属性
      7.1 调用后置处理器InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(beanClass, beanName)方法
      7.2 调用后置处理器InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法,返回PropertyValues
      7.3 applyPropertyValues(beanName, mbd, bw, pvs);应用返回的属性值
    8.initializeBean(beanName, exposedObject, mbd);初始化Bean
      7.1 调用Aware接口的方法invokeAwareMethods()。BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
      7.2 调用后置处理器BeanPostProcessor的postProcessBeforeInitialization()方法
      7.3 执行初始化方法invokeInitMethods()。InitializingBean.afterPropertiesSet()、@Bean注解initMethod属性指定的方法
      7.4 调用后置处理器BeanPostProcessor的postProcessAfterInitialization()方法
      7.5 判断Bean是否有销毁方法、@Bean注解destoryMethod属性指定的方法。若有把方法封装成DisposableBeanAdapter并注入到容器中,容器关闭时调用

    《Spring源码解析(一)--Spring容器刷新》

    《Spring源码解析(二)--Spring Bean创建》

    《Spring源码解析(三)--AOP实现原理》

    https://www.cnblogs.com/zhuqianchang/p/11423611.html

  • 相关阅读:
    C++从array数组向vector向量复制元素的两种方式
    CentOS7安装高版本gcc
    牛客网华为机试题之Python解法
    python列表和字符串的三种逆序遍历方式
    python中的三种输入方式
    ubuntu安装spyder和jupyter notebook
    ubuntu安装苹果Windows以及微软雅黑consolas字体
    Ubuntu安装pyenv实现python多版本控制
    vim配置文件.vimrc
    安装完Ubuntu后通过shell脚本一键安装软件
  • 原文地址:https://www.cnblogs.com/zhuqianchang/p/11418189.html
Copyright © 2011-2022 走看看