Spring配置类的分类

  • full – 完整配置类
    • 使用@Configuration注解的类
  • lite – 简化配置类
    • 没有使用@Configuration注解,但是
      • 使用了注解@Component或者注解@Component变种的类
      • 或者使用了注解@ComponentScan的类
      • 或者使用了注解@Import的类
      • 或者使用了注解@ImportResource的类
      • 或者某个配置类含有使用@Bean注解的方法的嵌套子类

      比如某个配置类(full/lite都可以)的嵌套子类自身不使用@Configuration,但含有使用@Bean注解的方法

    • 一定不会是接口

以上信息根据Spring源代码分析获得,代码可参考:

  1. ConfigurationClassUtils#isFullConfigurationCandidatefull判断实现逻辑
  2. ConfigurationClassUtils#isLiteConfigurationCandidatelite判断实现逻辑
  3. ConfigurationClassUtils#checkConfigurationClassCandidate – 以上逻辑的组合使用
  4. 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() {
            // ...
        }
    }
}

在上面的例子中 :

  1. MapConfig是完整配置类
  2. ModuleAConfig是简化配置类
  3. ModuleBConfig简化配置类
  4. ModuleCConfig是完整配置类

full配置类和lite配置类的区别

1.标注了@configuration的FULL配置类,在FULL配置类中注册的 组件类,会在
  ConfugurationClassPostProcessor#postProcessBeanFactory()方法中被
  ConfiguratioClassEnhancer 代理,交由容器 处理依赖关系
  意思就是@configuration相比其他配置类的区别,就是动态代理,@Bean方法生成对象,会交给代理类执行
  这样就保证了,@Bean方法只会返回一个单例对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值