配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(下)

简介: 配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(下)

proxyBeanMethods属性的作用


proxyBeanMethods属性是Spring 5.2.0版本为@Configuration注解新增加的一个属性:


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
  @AliasFor(annotation = Component.class)
  String value() default "";
  // @since 5.2
  boolean proxyBeanMethods() default true;
}


它的作用是:是否允许代理@Bean方法。说白了:决定此配置使用Full模式还是Lite模式。为了保持向下兼容,proxyBeanMethods的默认值是true,使用Full模式配置。


Spring 5.2提出了这个属性项,是期望你在已经了解了它的作用之后,显示的把它置为false的,因为在云原生将要到来的今天,启动速度方面Spring一直在做着努力,也希望你能配合嘛。这不Spring Boot就“配合”得很好,它在2.2.0版本(依赖于Spring 5.2.0)起就把它的所有的自动配置类的此属性改为了false,即@Configuration(proxyBeanMethods = false)。


Full模式/Lite模式实现上的差异


由于Spring 5.2.0新增了proxyBeanMethods属性来控制模式,因此实现上也有些许诧异,请各位注意甄别:


Spring 5.2.0+版本判断实现:


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;
    }


Spring 5.2.0-版本判断实现:


ConfigurationClassUtils:
    if (isFullConfigurationCandidate(metadata)) {
      beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL);
    } else if (isLiteConfigurationCandidate(metadata)) {
      beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
    } else {
      return false;
    }

思考题?


  1. 既然isConfigurationCandidate()判断方法是为checkConfigurationClassCandidate()服务,那Spring为何也把它设计为public static呢?
  2. ConfigurationClassUtils里还存在对@Order顺序的解析方法,不是说Spring的Bean是无序的吗?这又如何理解呢?


总结


本文作为上篇文章的续篇,解释了@Configuration配置的Full模式和Lite模式的判断原理,同时顺带的也介绍了什么叫主配置配和次配置类,这个概念(虽然官方并不这么叫)对你理解Spring Framework是非常有帮助的。如果你使用是基于Spring 5.2.0+的版本,在了解了这两篇文章内容的基础上,建议你的配置类均采用Lite模式去做,即显示设置proxyBeanMethods = false。


另外关于此部分内容,有些更为感兴趣的小伙伴问到:为什么Full模式下通过方法调用指向的仍旧是原来的Bean,保证了只会执行一次呢?开启的是Full模式这只是表象原因,想要回答此问题需要涉及到CGLIB增强实现的深水区内容,为了满足这些好奇(好学)的娃子,计划会在下篇文章继续再拿一篇专程讲解(预计篇幅不短,万字以上),你可订阅我的公众号持续保持关注。

相关文章
|
存储 算法 编译器
【C++技能树】再也不怕没有对象了 --初识类
我们先来看看C语言解决一个问题的过程。
75 0
|
Java Spring 容器
面试官:@Configuration 和 @Component 注解的区别?大部分人都会答错!
面试官:@Configuration 和 @Component 注解的区别?大部分人都会答错!
134 0
面试官:@Configuration 和 @Component 注解的区别?大部分人都会答错!
|
XML Java 数据格式
了解一点儿JavaConfig
Java 5 的推出,加上当年基于纯Java Annotation的依赖注入框架Guice的出现,使得Spring框架及其社区也“顺应民意”,推出并持续完善了基于Java代码和Annotation元信息的依赖关系绑定描述方式,即JavaConfig项目。
96 0
|
Java Spring 容器
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(上)
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(上)
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(上)
|
存储 Java 程序员
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(上)
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(上)
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(上)
|
Java Spring 容器
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(下)
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(下)
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(下)
|
设计模式 Java API
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(中)
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(中)
你自我介绍说很懂Spring配置类,那你怎么解释这个现象?(中)
|
Java Spring 容器
Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)(上)
Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)(上)
Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)(上)
|
Java 调度 Spring
Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)(下)
Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)(下)
Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)(下)
|
XML Java 数据库连接
1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知(下)
1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知(下)
1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知(下)