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效果一样:

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

  • 相关阅读:
    windows下虚拟环境安装方法
    用python 将 pymysql操作封装成类
    通过python的logging模块输出日志文件
    详细User-Agent大全
    多个结果显示成一个group_concat函数
    pytest 失败用例重试
    Python selenium 三种等待方式详解
    自定义列标题 case when
    查询结果多个合并一个GROUP_CONCAT(EmployeeName)
    win7_32虚拟机网络设置
  • 原文地址:https://www.cnblogs.com/warrior4236/p/13224454.html
Copyright © 2011-2022 走看看