SpringBoot 1.5.12.RELEASE 版本
已为例JdbcTemplate 为例。
spring-boot-autoconfigure-1.5.12.RELEASE.jar!\org\springframework\boot\autoconfigure\jdbc\JdbcTemplateAutoConfiguration.class
地方
1.1.1
@Configuration
表明是一个配置类,和以前编写的配置文件一样。注解引用
@Component给容器中添加组件
1.1.2
@ConditionalOnClass({DataSource.
class
, JdbcTemplate.
class
})
DataSource、JdbcTemplate类
在应用的classpath上时才开启自动配置
部分condition条件
@ConditionalOnBean:
|
当容器里有指定Bean的条件下
|
@ConditionalOnClass:
|
当类路径下有指定类的条件下
|
@ConditionalOnExpression:
|
基于SpEL表达式作为判断条件
|
@ConditionalOnJava:
|
基于JV版本作为判断条件
|
@ConditionalOnJndi:
|
在JNDI存在的条件下差在指定的位置
|
@ConditionalOnMissingBean:
|
当容器里没有指定Bean的情况下
|
@ConditionalOnMissingClass:
|
当类路径下没有指定类的条件下
|
@ConditionalOnNotWebApplication:
|
当前项目不是Web项目的条件下
|
@ConditionalOnProperty:
|
指定的属性是否有指定的值
|
@ConditionalOnResource:
|
类路径是否有指定的值
|
@ConditionalOnSingleCandidate:
|
当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean
|
@ConditionalOnWebApplication:
|
当前项目是Web项目的条件下
|
1.1.3
@ConditionalOnSingleCandidate(DataSource.
class
)
仅在单数据源bean存在时才生效
1.1.4
@AutoConfigureAfter({DataSourceAutoConfiguration.
class
})
在
DataSourceAutoConfiguration之后再加载
1.1.4.1 DataSourceAutoConfiguration的自动注入
1.1.4.2
@EnableConfigurationProperties({DataSourceProperties.
class
})
@EnableConfigurationProperties 中引入类EnableConfigurationPropertiesImportSelector
@Import({EnableConfigurationPropertiesImportSelector.
class
})
类DataSourceProperties 为最终获取到配置文件配置信息的类。
其他配置信息,可以参考
xxxxProperties 类。 路径spring-boot-autoconfigure-1.5.12.RELEASE.jar!\org\springframework\boot\autoconfigure\jdbc\DataSourceProperties.class
即大多数自动化配置信息都在 org\springframework\boot\autoconfigure 中。
以HttpEncodingAutoConfiguration 为例
spring-boot-autoconfigure-1.5.12.RELEASE.jar!\org\springframework\boot\autoconfigure\web\HttpEncodingAutoConfiguration.class
2.1 @EnableConfigurationProperties({HttpEncodingProperties.
class})
使 HttpEncodingProperties中的@ConfigurationProperties生效,注入容器。
配置类中,配置路径
spring.http.encoding
2.2 @ConditionalOnWebApplication 当前是web项目
2.3 @ConditionalOnClass({CharacterEncodingFilte
r.
class})
类CharacterEncodingFilter 继承于 OncePerRequestFilter
运行OncePerRequestFilter 的 doFilter() 时调用子类的 doFilterInternal()方法
给请求和响应设置编码
判断配置文件 //即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
注解@ConditionalOnProperty 配合看一篇花里胡哨的博文
https://www.cnblogs.com/yaphetsfang/p/11817999.html
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
/**
* String数组 该属性与下面的 name 属性不可同时使用,
* 当value所对应配置文件中的值为false时,注入不生效,不为fasle注入生效
* value有多个值时,只要有一个值对应为false,则注入不成功
*/
String[] value() default {};
/**
* 配置文件中key的前缀,可与value 或 name 组合使用 */
String prefix() default "";
/** * 与 value 作用一致 */
String[] name() default {};
/** * 与value 或 name 组合使用,只有当value 或 name 对应的值与havingValue的值相同时,注入生效 */
String havingValue() default "";
/** * 配置中缺少对应的属性时,是否可以被注入;为true时缺少对应配置可注入 */
boolean matchIfMissing() default false;} */ String havingValue() default "";
/** *该属性为true时,配置文件中缺少对应的value或name的对应的属性值,也会注入成功 */
boolean matchIfMissing() default false;