当前位置: 首页 > 最新文章 > 正文

ConfigurationfalseproxyBeanMethods详解九章算法杨辉三角的规律(详解九章算法杨辉三角的规律)

Boolean.FALSE.equals) { beanDef.setAttribute; } else if (config != null || isConfigurationCandidate) { beanDef.setAttribute; } else { return false; }@Configuration顺

admin

Boolean.FALSE.equals) { beanDef.setAttribute; } else if (config != null || isConfigurationCandidate) { beanDef.setAttribute; } else { return false; }@Configuration顺序@Configuration配置类是有主次之分的,主配置类是驱动整个程序的入口,可以是一个,也可以是多个Full模式Full模式下通过方法调用指向的仍旧是原来的Bean利用cglib代理增强,bean是单例的,@Bean方法调用生成实例时,如果已经存在这个bean,直接返回ConfigurationClassPostProcessor#enhanceConfigurationClasses源码如下。) { throw new BeanDefinitionStoreException; } else if { logger.info; } configBeanDefs.put;}lite模式lite模式下,直接返回新实例对象。Spring 5.2.0+的版本,建议你的配置类均采用Lite模式去做,即显示设置proxyBeanMethods = false。

Full 模式 VS Lite 模式

proxyBeanMethods = true 或不写,是Full模式

proxyBeanMethods = false 是lite模式

不带@Configuration的类叫Lite配置类

ConfigurationClassUtils

    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源码如下。

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源码如下。

@Configuration(proxyBeanMethods = false) 详解

AopAutoConfiguration springboot 2.3.4源码如下。

@Configuration(proxyBeanMethods = false) 详解


上一篇: 手机App又背着你干坏事了?或许是内嵌SDK在捣鬼 下一篇:“自由”与“规则”到底该如何平衡?
返回顶部