源码角度分析@configuration和@component不同

        1.@configuration是@component的内部类,@configuration包含@component注解。

        2.@configuration中所有带@Bean都会被CGLIB动态代理,调用此配置类中的方法都会返回同一个实例。@component不会被代理,调用配置类中的方法都会新建一个实例。

        3.@configuration标注的类要求:       

                1.必须是类(不可以是工厂返回的实例),不能是final类(final不可CGLIB动态代理)

                2.配置类不可以是native方法

                3.嵌套配置类需要声明为static

                4.@Bean方法不会进一步反过来创建配置类,即便有@configuration,只会作为不同的Bean

加载流程:

1.再springboot程序,run方法中,有个refreshcontext(),的refresh()

2.obtainFreshBeanFactoryConfigurationClassPostProcessor 注册到beanDefinition中

3.invokeBeanFactoryPostProcessors 实例化ConfigurationClassPostProcessor ,将配置类带@configuration的配置类添加标志位FULL,@component、@ComponentScan添加Lite。

4.通过invokeBeanFactoryPostProcessors将FULL的配置类通过Enhancer再字节码层面生成CGLIB子类,替换原来的@Bean方法。

5.finishBeanFactoryInitialization实例化非懒加载对象。

你可能感兴趣的:(java,开发语言)