Spring-boot
仅仅简单了解自动装配的一个简单的过程。
run -> refreshContext -> refresh -> invokeBeanFactoryPostProcessors -> InvokeBeanDefinitionRegistryPostProcessor >
-> …-> selectImport()
加载spring.factories 候选配置类()
加载spring-boot-autoconfigure.properties 元配置 (可去掉不需要的配置,来优化spring-boot的启动)
@ConditionalOnClass():如果 maven 中引入了该类 就将该类初始化到容器中,
@Condition() 根据时间Condition 接口的match 方法去判断是否初始化到容器中。
等等还有许多相似作用,但在不去同情况下使用的注解
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效
从spring-autoconfigure-metadata.properties属性文件中提取自动配置元数据AutoConfigurationMetadata;
获取spring.factories属性文件中属性org.springframework.boot.autoconfigure.EnableAutoConfiguration定义的所有配置类作为候选配置类;
然后,获取spring.factories属性文件中属性org.springframework.boot.autoconfigure.AutoConfigurationImportFilter定义的过滤器,缺省是一个 : org.springframework.boot.autoconfigure.condition.OnClassCondition
对所有的候选配置类在自动配置元数据上应用所发现的过滤器,
其实缺省情况下就一个,就是 OnClassCondition,也就是利用每个候选配置类上的注解
@ConditionalOnClass,来看这个候选配置类是否需要被应用。
selectImports()会返回所有需要被应用的配置类(注解@ConditionalOnClass条件被满足),
ConfigurationClassPostProcessor.postProcessBeanFactory()会将识别 这些配置类中定义的bean并将它们注册到容器。
下一步或许应该了解filter的作用。