4个核心
- 自动配置(重要)
- 起步依赖(重要)
- 命令行界面(没用过)
- Actuator(可选,带来很多有用的监控功能)
自动配置
针对很多Spring应用程序常见的应用功能,Spring Boot提供相关默认的配置。 在传统的spring开发中,无论是spring自身或者是与第三方框架(spring mvc、mybatis、Redis、RocketMQ...)整合时,需要配置大量的配置,而使用Spring Boot可以做到零配置,当然用户可以自定义配置来覆盖Spring Boot的默认配置。这极大的简化了开发。实现的原理在上一篇中有提到,这里总结一下自动配置的原理:@EnableAutoConfiguration注解开启自动配置功能,该注解Import了EnableAutoConfigurationImportSelector,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有MEAT-INF/spring.factories文件。下面是spring-boot-autoconfigure-1.5.20.RELEASE.jar包下spring.factories文件的部分配置
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
SpringBoot启动时会扫描spring.factorie中的类,如上面的*AutoConfiguration类,而这些*AutoConfiguration类中关键的注解是@Conditional,只要当前应用程序满足@Conditional注解的条件,就会启动响应的功能,并且使用默认配置。
起步依赖
在传统的Spring开发时,要引入SpringMvc需要引入很多个jar包,特别麻烦。起步依赖其实就是特殊的Maven依 赖和Gradle依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制 的依赖。例如用Spring Boot的起步依赖引入Spring Mvc,只需添加Spring Boot的Web起步依赖 (org.springframework.boot:spring-boot-starter-web),仅此一个。它会根据依赖 传递把其他所需依赖引入项目里,你都不用考虑它们。起步依赖可以理解成基于功能的依赖,只要告诉Spring Boot你要使用什么功能,Spring Boot就可以将相关的依赖加载进来。
Actuator
其他几个部分旨在简化Spring开发,而Actuator 则要提供在运行时检视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况 了,包括如下细节:
- Spring应用程序上下文里配置的Bean
- Spring Boot的自动配置做的决策
- 应用程序取到的环境变量、系统属性、配置属性和命令行参数
- 应用程序里线程的当前状态
- 应用程序近处理过的HTTP请求的追踪情况
- 各种和内存用量、垃圾回收、Web请求以及数据源用量相关的指标
SpringBoot是什么
从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。从根本上来说,Spring Boot的项目只是普通的Spring项目,只是它们正好用到了Spring Boot 的起步依赖和自动配置而已。
@SpringBootApplication
开启了Spring的组件扫描和Spring Boot的自动配置功能。这是个组合注解,内部包括以下注解
- Spring的@Configuration:标明该类使用Spring基于Java的配置。虽然本书不会写太多 配置,但我们会更倾向于使用基于Java而不是XML的配置。
- Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被 自动发现并注册为Spring应用程序上下文里的Bean。本章稍后会写一个简单的Spring MVC 控制器,使用@Controller进行注解,这样组件扫描才能找到它。
- Spring Boot的- --@EnableAutoConfiguration:这个不起眼的小注解也可以称为 @Abracadabra①,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成 篇的配置了
覆盖起步依赖引入的传递依赖
将不需要的依赖exclude排除掉, 可以为你的项目瘦身;如果需要用另一个版本的依赖,则可以直接引进其他版本的依赖,Maven总是会用近的依赖,也就是说,你在项目的构建说明文件里增加的这个依赖,会覆 盖传递依赖引入的另一个依赖。不管什么情况,在覆盖Spring Boot起步依赖引入的传递依赖时都要多加小心。虽然不同的版 本放在一起也许没什么问题,但你要知道,起步依赖中各个依赖版本之间的兼容性都经过了精心 的测试
自定义配置
覆盖Spring Boot自动配置
大多数情况下,自动配置的Bean刚好能满足你的需要,不需要去覆盖它们。但某些情况下, Spring Boot在自动配置时还不能很好地进行推断。 这里有个不错的例子:当你在应用程序里添加安全特性时,自动配置做得还不够好。安全配 置并不是放之四海而皆准的,围绕应用程序安全有很多决策要做,Spring Boot不能替你做决定。 虽然Spring Boot为安全提供了一些基本的自动配置,但是你还是需要自己覆盖一些配置以满足特 定的安全要求
创建自定义的配置
覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置。这段显式配置的形式不限,Spring支持的XML和Groovy形式配置都可以。 在编写显式配置时,我们会专注于Java形式的配置。再重申一次,想要覆盖Spring Boot的自动配置,你所要做的仅仅是编写一个显式的配置。 Spring Boot会发现你的配置,随后降低自动配置的优先级,以你的配置为准。
掀开自动配置的神秘面纱
正如我们在2.3.3节里讨论的那样,Spring Boot自动配置自带了很多配置类,每一个都能运用 在你的应用程序里。它们都使用了Spring 4.0的条件化配置,可以在运行时判断这个配置是该被运 用,还是该被忽略。 大部分情况下,表2-1里的@ConditionalOnMissingBean注解是覆盖自动配置的关键。 Spring Boot的DataSourceAutoConfiguration中定义的JdbcTemplate Bean就是一个非常简 单的例子,演示了@ConditionalOnMissingBean如何工作:
@Bean
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(this.dataSource);
}
jdbcTemplate()方法上添加了@Bean注解,在需要时可以配置出一个JdbcTemplate Bean。但它上面还加了@ConditionalOnMissingBean注解,要求当前不存在JdbcOperations 类型(JdbcTemplate实现了该接口)的Bean时才生效。如果当前已经有一个JdbcOperations Bean了,条件即不满足,不会执行jdbcTemplate()方法。 什么情况下会存在一个JdbcOperations Bean呢?Spring Boot的设计是加载应用级配置,随 后再考虑自动配置类。因此,如果你已经配置了一个JdbcTemplate Bean,那么在执行自动配置 时就已经存在一个JdbcOperations类型的Bean了,于是忽略自动配置的JdbcTemplate Bean。
通过属性文件外置配置
实际上,Spring Boot应用程序有多种设置途径。Spring Boot能从多种属性源获得属性,包括 如下几处。
(1) 命令行参数
(2) java:comp/env里的JNDI属性
(3) JVM系统属性
(4) 操作系统环境变量
(5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random. long})
(6) 应用程序以外的application.properties或者appliaction.yml文件
(7) 打包在应用程序内的application.properties或者appliaction.yml文件
(8) 通过@PropertySource标注的属性源
(9) 默认属性 这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先 级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。
application.properties和application.yml文件能放在以下四个位置。
(1) 外置,在相对于应用程序运行目录的/config子目录里。
(2) 外置,在应用程序运行的目录里。
(3) 内置,在config包内。
(4) 内置,在Classpath根目录。
同样,这个列表按照优先级排序。也就是说,/config子目录里的application.properties会覆盖 应用程序Classpath里的application.properties中的相同属性。
此外,如果你在同一优先级位置同时有application.properties和application.yml,那么application. yml里的属性会覆盖application.properties里的属性。
自动配置微调
有300多个属性可以用来微调Spring Boot应用程序里的Bean。附录C有一个详尽的 列表。
例 如,把它放在应用程序Classpath根目录的application.yml文件里:
server: port: 8000
配置日志
大多数应用程序都提供了某种形式的日志。即使你的应用程序不会直接记录日志,你所用的 库也会记录它们的活动。 默认情况下,Spring Boot会用Logback(http://logback.qos.ch)来记录日志,并用INFO级别输 出到控制台。
用其他日志实现替换Logback 。一般来说,你不需要切换日志实现;Logback能很好地满足你的需要。但是,如果决定使 用Log4j或者Log4j2,那么你只需要修改依赖,引入对应该日志实现的起步依赖,同时排除掉 Logback。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
如果你想用Log4j2,可以把spring-boot-starter-log4j改成spring-boot-starter-log4j2。 要完全掌握日志配置,可以在Classpath的根目录(src/main/resources)里创建logback.xml文 件。
即使如此,你对日志配置常做的改动就是修改日志级别和指定日志输出的文件。使用了 Spring Boot的配置属性后,你可以在不创建logback.xml文件的情况下修改那些配置。
要设置日志级别,你可以创建以logging.level开头的属性,后面是要日志名称。如果根 日志级别要设置为WARN,但Spring Security的日志要用DEBUG级别,可以在application.yml里加入 以下内容:
logging:
path: /var/logs/
file: BookWorm.log
level:
root: WARN
org:
springframework:
security: DEBUG
使用Profile进行配置
当应用程序需要部署到不同的运行环境时,一些配置细节通常会有所不同。。Profile是一种条件化配置,基于运行时激活的Profile,会 使用或者忽略不同的Bean或配置类。
参考《Spring Boot实战 ,丁雪丰 (译者)》
网友评论