阅读更多
1 条件注解
1.1 Class Conditions
@ConditionalOnClass
:classpath
中包含指定类时,包含配置@ConditionalOnMissingClass
:classpath
中不包含指定类时,包含配置
- 其中
value
属性填写的是真实的类(Class对象),name
属性,填写的是类名
1.2 Bean Conditions
@ConditionalOnBean
:ApplicationContext
中包含指定Bean
时,包含配置@ConditionalOnMissingBean
:ApplicationContext
中不包含指定Bean
时,包含配置
- 其中
value
属性按类型匹配Bean
,name
属性按名字匹配Bean
- 条件是否成立,只取决于Spring在处理注解时的
ApplicationContext
- 如果
@ConditionalOnBean
和@ConditionalOnMissingBean
标记在类上,且类中无一条件匹配,那么类上标记的@Configuration
将会被忽略(换言之,该类本身不会生成Bean
)
1.3 Property Conditions
@ConditionalOnProperty
:允许基于Spring Environment
属性包含配置。使用prefix
和name
属性指定应检查的属性。默认情况下,匹配存在且不等于false
的任何属性。您还可以使用havingValue
和matchIfMissing
属性创建更高级的检查
1.4 Resource Conditions
@ConditionalOnResource
:允许存在特定资源时包含配置。可以使用常用的Spring
约定来指定资源,例如:file:/home/user/test.dat
1.5 Web Application Conditions
@ConditionalOnWebApplication
:当应用是Web Application
时,包含配置@ConditionalOnNotWebApplication
:当应用不是Web Application
时,包含配置Web Application
是指包含了WebApplicationContext
,或StandardServletEnvironment
的应用
1.6 SpEL Expression Conditions
@ConditionalOnExpression
:基于SpEL expression
的结果,决定是否包含配置
1.7 Starter的结构
一般而言,一个Spring-Boot-Starter
应用,一般包含如下两个模块:
autoconfigure module
:用于包含配置代码starter module
:依赖于autoconfigure module
,以及其他应用的依赖
- 我们也可以将以上两个模块合成一个模块
2 META-INF/spring.factories
一些三方项目如何与Spring集成,并且无需任何配置就可以自动注入到我们应用的上下文中?答案就是:基于约定
。
META-INF/spring.factories
是spring-autoconfig
的核心配置文件
org.springframework.boot.diagnostics.FailureAnalyzer
org.springframework.boot.autoconfigure.EnableAutoConfiguration
org.springframework.context.ApplicationContextInitializer
org.springframework.context.ApplicationListener
org.springframework.boot.env.EnvironmentPostProcessor
org.springframework.boot.autoconfigure.AutoConfigurationImportListener
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider
org.springframework.test.context.TestExecutionListener
org.springframework.test.context.ContextCustomizerFactory
org.springframework.boot.env.PropertySourceLoader
org.springframework.boot.SpringApplicationRunListener
org.springframework.boot.diagnostics.FailureAnalysisReporter
3 todo
ConfigurationProperties 属性必须有get/set方法