zoukankan      html  css  js  c++  java
  • spring源码分析—— 初始化的三种方式的分析

      在对bean对象设置完属性polulateBean之后,可以对bean进行初始化,初始化的方式有很多,

    可以在xml中配置init-method属性,可以实现InitializingBean接口,重写AfterPropertiesSet方法,也可以通过

    注解@PostConstruct实现初始化

    1:准备工作

     运行结果:

    2:下面看一下源码中怎么实现的

    调用initializeBean方法对bean进行初始化

    先来看一下PostConstruct注解的初始化,因为它是依赖于CommonAnnotationBeanPostProcessor实现的,所以在扫描注解Component组件,实现注册后,

    需要注册这个类的BeanDefinition对象到BeanDefinitionMaps中,在refresh方法中registerBeanPostProcessor实现实例化并注册到BeanPostProcessors缓存中

    搜集注解元数据信息,在如下方法中实现,封装到CommonAnnotationBeanPostProcessor中的injectMetamentMap中,前边分析注解的时候都涉及到,这里忽略

    看一下拦截,调用PostContruct方法如何实现?

    调用到CommonAnnotationBeanPostProcessor对象的前置接口postProcessBeforeInitialization()

     

     

     这样就调到了PostConstruct注解的方法上了。

    再来看看实现InitializingBean接口,重写AfterPropertiesSet方法怎么实现的呢?

    这个很简单

     

    再来看一下init-method属性的实现方式?

    反射获取到方法并调用:

    反射调用:

    如果配置成@Bean上的init-method属性,初始化时机会怎样?

    运行结果:可以看出@Bean上配置init-method属性与xml上bean元素配置init-method效果一样:

    这样几种初始化的过程就分析完了

  • 相关阅读:
    (10)时间
    (9)字符串
    (8)数组工具类
    (7)数学工具类
    (6)随机数
    (5)包装类
    (4)声明式接口和常用接口
    (3)java.lang.System
    (2)java.lang.Object
    (1)开篇
  • 原文地址:https://www.cnblogs.com/warrior4236/p/13224454.html
Copyright © 2011-2022 走看看