欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注公众号:Java学习之道 Fork me on GitHub

SpringBoot学习(六)-->SpringBoot的自动配置的原理

Spring Boot的自动配置的原理

Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器。

1、Maven下载源码

通过 dependency:sources 该命令可以下载该项目中所有的依赖的包的源码。

2、源码分析

在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->META-INF-->spring.factories

 1 # PropertySource Loaders
 2 org.springframework.boot.env.PropertySourceLoader=\
 3 org.springframework.boot.env.PropertiesPropertySourceLoader,\
 4 org.springframework.boot.env.YamlPropertySourceLoader
 5 
 6 # Run Listeners
 7 org.springframework.boot.SpringApplicationRunListener=\
 8 org.springframework.boot.context.event.EventPublishingRunListener
 9 
10 # Application Context Initializers
11 org.springframework.context.ApplicationContextInitializer=\
12 org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
13 org.springframework.boot.context.ContextIdApplicationContextInitializer,\
14 org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
15 org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer
16 
17 # Application Listeners
18 org.springframework.context.ApplicationListener=\
19 org.springframework.boot.ClearCachesApplicationListener,\
20 org.springframework.boot.builder.ParentContextCloserApplicationListener,\
21 org.springframework.boot.context.FileEncodingApplicationListener,\
22 org.springframework.boot.context.config.AnsiOutputApplicationListener,\
23 org.springframework.boot.context.config.ConfigFileApplicationListener,\
24 org.springframework.boot.context.config.DelegatingApplicationListener,\
25 org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
26 org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
27 org.springframework.boot.logging.LoggingApplicationListener
28 
29 # Environment Post Processors
30 org.springframework.boot.env.EnvironmentPostProcessor=\
31 org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
32 org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor
33 
34 # Failure Analyzers
35 org.springframework.boot.diagnostics.FailureAnalyzer=\
36 org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,\
37 org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,\
38 org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,\
39 org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,\
40 org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,\
41 org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,\
42 org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer
43 
44 # FailureAnalysisReporters
45 org.springframework.boot.diagnostics.FailureAnalysisReporter=\
46 org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter
spring.factories

其中配置了很多内容,如第11行的ApplicationContextInitializer;接下来我们详细了解一下SpringApplication

在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->org.springframework.boot-->SpringApplication.class:


 

按住ctrl点击loadFactoryNames:

能在org.springframework.core.io.support下找到SpringFactoriesLoader类:

所以其是读取该配置文件来加载内容的。

3、举例:Redis的自动配置

从上述的配置中可以看出,在Maven Dependencies-->spring-boot-autoconfigure-1.5.2.RELEASE.jar-->org.springframework.boot.autoconfigure.data.redis-->RedisAutoConfiguration.class是Redis的自动配置。


 

4、源码中的条件注解的解释

@ConditionalOnBean: 当容器里有指定的Bean的条件下
@ConditionalOnClass: 当类路径下有指定的类的条件下
@ConditionalOnExpression: 基于SpEL表达式作为判断条件
@ConditionalOnJava: 基于JVM版本作为判断条件
@ConditionalOnJndi: 在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean: 当容器里没有指定Bean的情况下
@ConditionalOnMissingClass:   当类路径下没有指定的类的条件下
@ConditionalOnNotWebApplication: 当前项目不是Web项目的条件下
@ConditionalOnProperty: 指定的属性是否有指定的值
@ConditionalOnResource: 类路径是否具有指定的值
@ConditionalOnSingleCandidate: 当指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication: 当前项目是Web项目的条件下

 

 

 

 

 

 

 

 

 

 

 


到这里,SpringBoot的概念原理实现之类的了解的差不多了,接下来我们开始将SpringBoot整合到真正的项目中。

posted @ 2018-07-03 10:54  淼淼之森  阅读(923)  评论(0编辑  收藏  举报
  👉转载请注明出处和署名