spring中只有标注`@Configurtion`的类才是配置类吗?答案:**不是的**
传送:
Spring大观园,我有过的困惑或许你也有!
导读
spring内部对配置类分为两种,区分的办法是:
解析后,在beanDef中添加属性"configurationClass",其值分两种,要么是"full" ,要么是"lite";
1. beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL);2. beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
替换常量后是这样
1. beanDef.setAttribute("configurationClass"), "full");2. beanDef.setAttribute("configurationClass"), "lite");
有何区别:
- full类的是带有
@Configuration
注解的配置类 - lite类的是
2.1 类上带有注解@Component
、@ComponentScan
、@Import
、@Component
、@ImportResource
;
2.2 类中的方法带有注解@Bean
避免重复解析
因为解析后,会在beanDef中setAttribute("configurationClass"), "full"/"lite");
所以,如果beanDef.getAttribute("configurationClass")不是null 就是被解析过了
if(beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE)!=null){if(logger.isDebugEnabled()){
logger.debug("Bean definition has already been processed as a configuration class: "+ beanDef);
}
}
源码视角
注解方式的配置类 的解析操作从ConfigurationClassPostProcessor#processConfigBeanDefinitions
方法中查看,
其中有个判断配置类的方法有点特别
ConfigurationClassUtils.checkConfigurationClassCandidate
... Map<String, Object> config = metadata.getAnnotationAttributes(Configuration.class.getName());
if(config !=null&&!Boolean.FALSE.equals(config.get("proxyBeanMethods"))){
//如果有有注解@Configuration,且其元数据中有"proxyBeanMethods",则为 full
beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL);
}
elseif(config !=null||isConfigurationCandidate(metadata)){
// lite 自己跟踪其源码一看便知
beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
}
else{
returnfalse;
}
...
了解配置类
如果是配置类,spring会对其进行解析,导入、扫描BeanDefinition,配置类解析从两个视角来:
- 脑图全晰视角:配置类解析流程
- 源码注释版的链接稍后敬上。
元数据中"proxyBeanMethods"的作用
作者:rock_fish
链接:https://www.jianshu.com/p/81d5d01444c2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是 spring中只有标注`@Configurtion`的类才是配置类吗?答案:**不是的** 的全部内容, 来源链接: utcz.com/z/514505.html