持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第04天,点击查看活动详情
简单地讲,Spring Boot 是 Spring 框架的扩展,它消除了使用 Spring 框架开发应用所需要的、大量的样板配置代码。 Spring Boot 中最显著的就是其所谓的“自动化配置”功能。 Spring Boot 项目追求的是快速、高效地开发,及完备的生态链。 Spring Boot 的特性有:
- 通过各种 starter 依赖,简化构建过程和应用配置;
- 通过内置 Server(tomcat/jetty)来避免部署时的复杂性;
- 通过 auto configure 尽可能地自动配置 Spring 框架
01-Spring Boot 中的常用注解之一:@SpringBootApplication。
@SpringBootApplication
public class SpringBootAnnotations {
public static void main(String[] args) {
SpringApplication.run(SpringBootAnnotations.class, args);
}
}
注解@SpringBootApplication等价于:@Configuration + @EnableAutoConfiguration + @ComponentScan
@EnableAutoConfiguration
注解的主要作用是开启自动化配置。
开启以后,Spring Boot 会在 classpath 中查找所有所有的 auto-configuration beans,并应用它们。
该标签必须与@Configuration搭配使用。
02-条件化自动配置
本节涉及的注解,可以与@Configuration或@Bean一起使用。
@ConditionalOnClass和@ConditionalOnMissingClass,仅当传入注解中的参数在 classpath 中存在(或不存在)时,@Configuration或@Bean才生效。@ConditionalOnBean和@ConditionalOnMissingBean,仅当传入注解中的 bean 存在(或不存在)时,@Configuration或@Bean才生效@ConditionalOnProperty,仅当某个 property 的值为特定值时,@Configuration或@Bean才生效@Bean @ConditionalOnProperty( name = "usemysql", havingValue = "local" ) DataSource dataSource() { // ... }@ConditionalOnResource,仅当某个资源(例如 classpath:application.properties)存在时,@Configuration或@Bean才生效@ConditionalOnResource(resources = "classpath:mysql.properties") Properties additionalProperties() { // ... }@ConditionalOnWebApplication和@ConditionalOnNotWebApplication,仅当应用是(或者不是)web 应用时,@Configuration或@Bean才生效@ConditionalOnWebApplication HealthCheckController healthCheckController() { // ... }@ConditionalExpression,仅当作为注解参数的 SpEL 表达式值为 true 时,@Configuration或@Bean才生效@Bean @ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}") DataSource dataSource() { // ... }@Conditional,仅当作为参数指定的类(实现了Condition接口)返回值为 true 时,@Configuration或@Bean才生效@Conditional(HibernateCondition.class) Properties additionalProperties() { //... } public class HibernateCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return true; } }