bean的生命周期核心步骤总结
  TEZNKK3IfmPf 2023年11月15日 23 0

BFPP与BPP说明

后续行文为了方便,用BFPP代指BeanFactoryPostProcessor,用BPP代指BeanPostProcessor。

xml/注解方式开启spring

// xml方式
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
// 注解方式
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("com.hulang.bean");

容器创建

refresh() 中的obtainFreshBeanFactory()

创建容器

创建的是DefaultListableBeanFactory

DefaultListableBeanFactory beanFactory = createBeanFactory();

设置容器属性值

beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);

加载bean定义信息

loadBeanDefinitions(beanFactory);

包含非常多的重名重载方法,建议debug调试查看,不然容易晕。

xlm转换成document

document解析成element
parseDefaultElement(ele, delegate)

默认的指bean

delegate.parseCustomElement(ele)

自定义的指以context、aop等开头或者自定义的标签。

以上两种标签解析后的结果都封装在BeanDefinition中,获取的是GenericBeanDefinition,后续实例化用的是RootBeanDefinition,需要进行一个合并。

给容器工厂设置属性值

prepareBeanFactory(beanFactory);

设置类加载器等

postProcessBeanFactory

空方法,供子类实现。

实例化和执行BFPP

invokeBeanFactoryPostProcessors(beanFactory)

调用和执行BFPP,操作的对象是BeanFactory,可以创建、修改或者引入其他的BeanDefinition,里面有个非常重要的类,ConfigurationClassPostProcessor

ConfigurationClassPostProcessor

完成@Bean,@Component.@ComponentScan,@Import,@ImportSource等注解的解析

完成BPP的实例化与注册

registerBeanPostProcessors(beanFactory),完成BPP的注册与实例化,方便后续在创建bean过程完成之后调用before/after方法堆bean进行增强。

完成自定义对象的创建

finishBeanFactoryInitialization(beanFactory)

List beanNames = new ArrayList<>(this.beanDefinitionNames);

将需要创建的对象放到list中,逐一进行创建。

getMergedLocalBeanDefinition会将上文提到的GenericBeanDefinition转换成RootBeanDefinition

for (String beanName : beanNames) {
      RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
      if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
        if (isFactoryBean(beanName)) {
          Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
          if (bean instanceof SmartFactoryBean<?> smartFactoryBean && smartFactoryBean.isEagerInit()) {
            getBean(beanName);
          }
        }
        else {
          getBean(beanName);
        }
      }
    }

getBean

doGetBean

先从容器中找,如果没有再创建

createBean

doCreataBean

createBeanInstance

创建bean有多重方式

getInstanceSupplier(Supplier方式创建)

instantiateUsingFactoryMethod(FactoryMethod方式创建)

instantiateBean(默认的,反射方式创建)

instantiateBean

其实还有个BPP代理模式创建对象,但不是在createBeanInstance,而是在前面的步骤

最终调用反射进行bean的创建

注册生命周期接口

也就是applyMergedBeanDefinitionPostProcessors

 
    // Allow post-processors to modify the merged bean definition.
    synchronized (mbd.postProcessingLock) {
      if (!mbd.postProcessed) {
        try {
          applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
        } catch (Throwable ex) {
          throw new BeanCreationException(mbd.getResourceDescription(), beanName,
              "Post-processing of merged bean definition failed", ex);
        }
        mbd.postProcessed = true;
      }
    }

再此步骤完成@PostConstruct、@PreDestory、@Resource、@Autowire、@Value注解的解析工作。

填充属性populateBean

创建依赖的对象,循环依赖问题再此触发

进行初始化initializeBean

执行invokeAwareMethods
  private void invokeAwareMethods(String beanName, Object bean) {
    if (bean instanceof Aware) {
      if (bean instanceof BeanNameAware) {
        ((BeanNameAware) bean).setBeanName(beanName);
      }
      if (bean instanceof BeanClassLoaderAware) {
        ClassLoader bcl = getBeanClassLoader();
        if (bcl != null) {
          ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
        }
      }
      if (bean instanceof BeanFactoryAware) {
        ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
      }
    }
  }

执行BPP的before方法

ApplicationAwarePostProcessors、CommonAnnotationBeanPostProcessor等

invokeInitMethods

如果实现了InitializingBean接口,需要调用afterPropertiesSet,最后一次修改属性值

执行用户自定义的init-method(invokeCustomInitMethod)

执行BPP的after方法

aop功能再此实现。

bean的生命周期核心步骤总结

销毁对象

destroyBeans()

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年04月26日   27   0   0 xml
  TEZNKK3IfmPf   2024年03月29日   28   0   0 xmljava
  TEZNKK3IfmPf   18天前   30   0   0 ajaxxml
  TEZNKK3IfmPf   2024年04月19日   35   0   0 xmlphp
TEZNKK3IfmPf