spring源码学习——ConfigurationClassBeanDefinition

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

本文难免会有错误,如有错误,欢迎指出

什么是ConfigurationClassBeanDefinition

在@Configuration注解的类中,使用@Bean注解实例化的Bean,其定义会用ConfigurationClassBeanDefinition存储

ConfigurationClassBeanDefinition的默认设置

1、如果@Bean注解没有指定bean的名字,默认会用方法的名字命名bean

2、@Configuration注解的类会成为一个工厂类,而所有的@Bean注解的方法会成为工厂方法,通过工厂方法实例化Bean,而不是直接通过构造函数初始化

3、@Bean注解注释的类会使用构造函数自动装配

源码

ConfigurationClassBeanDefinition是一个内部类,其外部类是ConfigurationClassBeanDefinitionReader,这个类负责将@Bean注解的方法转换为对应的ConfigurationClassBeanDefinition类,源码就不过多解释了,和之前几个BeanDefinition差不多

        private static class ConfigurationClassBeanDefinition extends RootBeanDefinition implements AnnotatedBeanDefinition {

                    可以获得注解相关的信息
            private final AnnotationMetadata annotationMetadata;

                    可以获得工厂方法相关的信息
            private final MethodMetadata factoryMethodMetadata;

            public ConfigurationClassBeanDefinition(ConfigurationClass configClass, MethodMetadata beanMethodMetadata) {
                this.annotationMetadata = configClass.getMetadata();
                this.factoryMethodMetadata = beanMethodMetadata;
                setLenientConstructorResolution(false);
            }

            public ConfigurationClassBeanDefinition(
                    RootBeanDefinition original, ConfigurationClass configClass, MethodMetadata beanMethodMetadata) {
                super(original);
                this.annotationMetadata = configClass.getMetadata();
                this.factoryMethodMetadata = beanMethodMetadata;
            }

            private ConfigurationClassBeanDefinition(ConfigurationClassBeanDefinition original) {
                super(original);
                this.annotationMetadata = original.annotationMetadata;
                this.factoryMethodMetadata = original.factoryMethodMetadata;
            }

            @Override
            public AnnotationMetadata getMetadata() {
                return this.annotationMetadata;
            }

            @Override
            public MethodMetadata getFactoryMethodMetadata() {
                return this.factoryMethodMetadata;
            }

            @Override
            public boolean isFactoryMethod(Method candidate) {
                return (super.isFactoryMethod(candidate) && BeanAnnotationHelper.isBeanAnnotated(candidate));
            }

            @Override
            public ConfigurationClassBeanDefinition cloneBeanDefinition() {
                return new ConfigurationClassBeanDefinition(this);
            }
        }

至此,所有的BeanDefinition解析完毕


来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » spring源码学习——ConfigurationClassBeanDefinition

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏