Spring @Configuration 加载

Spring @Configuration 加载_第1张图片
  • 为什么方法A只会调用一次。
  • Spring IOC的过程是
    资源文件(xml,annotation,class, yml/properties) -> BeanDefinition -> BeanWrapper(依赖注入) -> Object
  • 而把@Configuration、@Bean解析成BeanDefinition是在org.springframework.context.annotation.ConfigurationClassPostProcessor
  • 然后它会把它伪装为xml 中factory-method


    Spring @Configuration 加载_第2张图片
  • 首先把@Bean注解解析到ConfigurationClass类中。


    Spring @Configuration 加载_第3张图片
  • 然后把它伪装为factory-method
    Spring @Configuration 加载_第4张图片
    183330092724433405.png
  • 在解析@configuration的时候获取到的方法是随即的 也就是a(),b()方法的顺序是随即的。
  • 就是把它添加到类ConfigurationClass的顺序是随机的。


    Spring @Configuration 加载_第5张图片
  • 但是在解析的时候只会保证调用方法a只会调用一次
  • 因为在处理@Configuration进行了Cglib增强。


    Spring @Configuration 加载_第6张图片
    726968080022510464.png
  • org.springframework.context.annotation.ConfigurationClassEnhancer.BeanMethodInterceptor
  • 它会判断容器中是否包含这个对象。


    Spring @Configuration 加载_第7张图片
  • 如果容器当中包含这个对象,就是从容器中直接获取。而不是调用一次方法。
  • 如果要控制@Configuration里面的调用顺序,你可以在@Bean里面添加方法参数。这样可以控制实例化的顺序。在处理这个类的时候,它就会先调用方法a,然后再调用方法b,因为实例B对象的初始化依赖于实例A的初始化。这样就达到控制方法调用顺序的目的


    Spring @Configuration 加载_第8张图片

你可能感兴趣的:(Spring @Configuration 加载)