full
– 完整配置类- 使用
@Configuration
注解的类
- 使用
lite
– 简化配置类- 没有使用
@Configuration
注解,但是- 使用了注解
@Component
或者注解@Component
变种的类 - 或者使用了注解
@ComponentScan
的类 - 或者使用了注解
@Import
的类 - 或者使用了注解
@ImportResource
的类 - 或者某个配置类含有使用
@Bean
注解的方法的嵌套子类
比如某个配置类(
full
/lite
都可以)的嵌套子类自身不使用@Configuration
,但含有使用@Bean
注解的方法 - 使用了注解
- 一定不会是接口
- 没有使用
以上信息根据Spring
源代码分析获得,代码可参考:
ConfigurationClassUtils#isFullConfigurationCandidate
–full
判断实现逻辑ConfigurationClassUtils#isLiteConfigurationCandidate
–lite
判断实现逻辑ConfigurationClassUtils#checkConfigurationClassCandidate
– 以上逻辑的组合使用ConfigurationClassParser#doProcessConfigurationClass
– 以上逻辑的业务应用
举例
//使用注解@Configuration
@Configuration
public class MapConfig {
// 没有使用注解@Configuration,但含有@Bean注解方法
// 没有使用 static
public class ModuleAConfig {
@Bean
Map poiLocations() {
// ...
}
}
// 没有使用注解@Configuration,但含有@Bean注解方法
// 使用 static
private static class ModuleBConfig {
@Bean
Map namedPOIs() {
// ...
}
}
//使用注解@Configuration
@Configuration
private static class ModuleCConfig {
@Bean
Map namedRegions() {
// ...
}
}
}
在上面的例子中 :
MapConfig
是完整配置类ModuleAConfig
是简化配置类ModuleBConfig
简化配置类ModuleCConfig
是完整配置类
full配置类和lite配置类的区别
1.标注了@configuration的FULL配置类,在FULL配置类中注册的 组件类,会在
ConfugurationClassPostProcessor#postProcessBeanFactory()方法中被
ConfiguratioClassEnhancer 代理,交由容器 处理依赖关系
意思就是@configuration相比其他配置类的区别,就是动态代理,@Bean方法生成对象,会交给代理类执行
这样就保证了,@Bean方法只会返回一个单例对象