Spring学习之@Configuration
@Configuration是什么? @Configuration 是 Spring提供的一个用于配置与声明Bean与相应Bean之间依赖的注解,根据文档描述,此注解通常由 AnnotationConfigApplicationContext 上下文进行启动加载 @Configuration能做什么? 先看一下此注解的声明,在此注解上标识了 @Component ,则证明此注解是一个 Component,拥有 @Component 注解的基础能力(可以被Spring容器自动扫描与加载) 上图标识了注解常用的配置方式,分类为以下几种 属性资源导入 引入其它配置类的配置 Value注入 Spring容器组件注入 支持Profile配置 注解属性 在Spring5.x版本中,只支持两个属性配置 value 配置注解的名称 proxyBeanMethods 是否代理增强(基于CGLIB)标识 @Bean 的方法,默认为true,保证声明的bean是单例共享的,而不是每一次通过方法调用都生成一个新的 此属性的两个值被定义为两种模式 full 模式(值为true) lite 模式(值为false) 源码分析 @Configuration 注解的解析类为 ConfigurationClassPostProcessor ,本次主要关注从 AnnotationConfigApplicationContext 启动后的整个处理过程, AnnotationConfigApplicationContext 启动分为三个阶段 先上一张三个阶段的涉及的主要类与调用关系图 初始化 初始化reader 此过程会实例化 AnnotatedBeanDefinitionReader 类,此类在实例化时会调用 AnnotationConfigUtils.registerAnnotationConfigProcessors 来注册解析配置的Processor,如果registry中没有包含 ConfigurationClassPostProcessor 类的定义,则会新new一个 ConfigurationClassPostProcessor 的Bean定义类 整体调用链路如下: 初始化scanner 此过程会实例化Bean定义扫描器 ClassPathBeanDefinitionScanner , 在此过程中主要会设置 Environment 和 ResourceLoader 相关信息 注册 注册阶段主要是对标注了 @Configuration 类(MyConfig)进行注册,以便Spring可以正常识别,主要逻辑在 AnnotatedBeanDefinitionReader#doRegisterBean 中,此方法会调用 BeanDefinitionReaderUtils.registerBeanDefinition 对此Bean进行注册 至此, @Configuration 类信息就注册到了 Spring 容器中 ...