前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@Configuration(proxyBeanMethods = false) 详解

@Configuration(proxyBeanMethods = false) 详解

作者头像
黑洞代码
发布2021-06-23 00:31:55
2.2K0
发布2021-06-23 00:31:55
举报

Full 模式 VS Lite 模式

proxyBeanMethods = true 或不写,是Full模式

proxyBeanMethods = false 是lite模式

不带@Configuration的类叫Lite配置类

ConfigurationClassUtils

代码语言:javascript
复制
    Map<String, Object> config = metadata.getAnnotationAttributes(Configuration.class.getName());
    if (config != null && !Boolean.FALSE.equals(config.get("proxyBeanMethods"))) {
        beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL);
    }
    else if (config != null || isConfigurationCandidate(metadata)) {
        beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
    }
    else {
        return false;
    }

@Configuration顺序

@Configuration配置类是有主次之分的,主配置类是驱动整个程序的入口,可以是一个,也可以是多个(若存在多个,支持使用@Order排序)

Full模式

Full模式下通过方法调用指向的仍旧是原来的Bean

利用cglib代理增强,bean是单例的,@Bean方法调用生成实例时,如果已经存在这个bean,直接返回

ConfigurationClassPostProcessor#enhanceConfigurationClasses源码如下。

代码语言:javascript
复制
if (ConfigurationClassUtils.CONFIGURATION_CLASS_FULL.equals(configClassAttr)) {
    if (!(beanDef instanceof AbstractBeanDefinition)) {
        throw new BeanDefinitionStoreException("Cannot enhance @Configuration bean definition '" +
                beanName + "' since it is not stored in an AbstractBeanDefinition subclass");
    }
    else if (logger.isInfoEnabled() && beanFactory.containsSingleton(beanName)) {
        logger.info("Cannot enhance @Configuration bean definition '" + beanName +
                "' since its singleton instance has been created too early. The typical cause " +
                "is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " +
                "return type: Consider declaring such methods as 'static'.");
    }
    configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef);
}

lite模式

lite模式下,直接返回新实例对象。

Spring 5.2.0+的版本,建议你的配置类均采用Lite模式去做,即显示设置proxyBeanMethods = false。Spring Boot在2.2.0版本(依赖于Spring 5.2.0)起就把它的所有的自动配置类的此属性改为了false,即@Configuration(proxyBeanMethods = false),提高Spring启动速度

AopAutoConfiguration springboot 2.1.3源码如下。

AopAutoConfiguration springboot 2.3.4源码如下。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Full 模式 VS Lite 模式
  • @Configuration顺序
  • Full模式
  • lite模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档