一、核心功能
核心功能(优点)
1、快速构建项目(提供starter简化配置)
2、主流开发框架的无配置集成(自动配置Spring)
3、可以jar包方式独立运行,无须依赖Servlet容器,内嵌Servlet容器(Tomcat、Jetty、Undertow)
4、提供运行时的应用监控
5、极大提高了开发和部署效率(无代码生成和xml配置,通过注解配置和java配置,自动化配置)
6、与云计算的天然集成,提供生产级特性actuator
快速集成
1、可到https://start.spring.io 快速配置下载demo
2、idea自带的Spring Initializr或eclipse的Spring Tool Suite
3、Spring Boot CLI命令行生成
4、Maven手工创建
- 添加Spring Boot的父级依赖
- 添加web支持的starter pom(spring-boot-starter-web)
- 添加编译插件
二、基本配置
入口类和@SpringBootApplication
有名为*Application的入口类,包含一个main方法,用来启动SpringBoot应用项目。
banner默认启动图案
可通过在src/main/resources新建banner.txt覆盖。也可在main里禁用。
配置文件
SpringBoot使用资源目录下的全局的配置文件application.properties(常规properties配置文件)或application.yml(yaml语言)。
SpringBoot提倡零xml配置,如特殊情况需要使用,可使用@ImportResource来加载。
如tomcat端口和访问路径:
1 | #properties版本 |
starter pom
提供了大多数场景的starter pom,包括官方和第三方,列举部分:
名称 | 描述 |
---|---|
spring-boot-starter | 核心starter,包含自动配置、日志、yaml配置文件等支持 |
spring-boot-starter-amqp | 使用spring-rabbit支持AMQP |
spring-boot-starter-aop | 使用spring-aop和AspectJ支持切面 |
spring-boot-starter-jpa | 对JPA支持,包含spring-data-jpa、spring-orm和Hibernate |
spring-boot-starter-freemarker | 对freemarker模板引擎支持 |
spring-boot-starter-thymeleaf | 对thymeleaf模板引擎支持 |
spring-boot-starter-volocity | 对volocity模板引擎支持 |
spring-boot-starter-jdbc | 对JDBC数据库的支持 |
spring-boot-starter-test | 对常用测试框架JUnit、Hamcrest等支持,包含spring-test模块 |
spring-boot-starter-web | 对Web项目开发的支持,包含Tomcat和spring-webmvc |
spring-boot-starter-Tomcat | 默认的Servlet容器Tomcat |
spring-boot-starter-Jetty | 使用Jetty作为Servlet容器替换Tomcat |
spring-boot-starter-Undertow | 使用Undertow作为Servlet容器替换Tomcat |
spring-boot-starter-logging | 默认的日志框架Logback |
spring-boot-starter-log4j | 支持使用Log4J日志框架 |
外部配置
SpringBoot允许使用properties文件、yaml文件或者命令行参数作为外部配置。
1 | $ java -jar xx.jar |
可使用@Value获取properties文件属性
1 |
|
也可以通过@ConfigurationProperties将properties属性和一个bean及其属性关联,实现类型安全的配置。prefix属性指定前缀,locations指定properties文件位置。
1 |
日志配置
SpringBoot默认使用Logback作为日志框架,输出到控制台。如需要输出到文件,可在properties文件配置。
1 | logging.level.org.springframework.web = INFO |
Profile配置
Profile是Spring用来针对不同的环境对不同的配置提供支持的。全局Profile配置使用application-{profile}.properties
通过在application.properties中设置spring.profiles.active=prod来指定生产环境的Profile。
三、运行原理
源码
一切要从@SpringBootApplication注解说起。@SpringBootApplication是核心的组合注解,组合了@Configuration、@EnableAutoConfiguration、@ComponentScan这3个注解。
1 |
|
自动配置的核心注解是@EnableAutoConfiguration。它也是个组合注解,核心是@Import({AutoConfigurationImportSelector.class})
1 |
|
AutoConfigurationImportSelector,继承自ImportSelector接口,selectImports返回的数组(类的全类名)都会被纳入到spring容器中。
1 |
|
SpringFactoriesLoader类的loadFactoryNames扫描了包含在META-INF/spring.factories的jar包,
1 | SpringFactoriesLoader类public static List<String> loadFactoryNames(Class<?> factoryType, { ClassLoader classLoader) |
而我们的spring-boot-autoconfigure-2.x.x.x.jar中有META-INF/spring.factories此文件。spring.factories文件包含了可自动配置的类。
spring会从org.springframework.boot.autoconfigure.EnableAutoConfiguration类中获取需要自动配置的所有配置类。
1 | # Initializers |
验证
如需要验证这些配置类是否正常加载,可开启debug后,可看到如下日志。开启方法:
1、java -jar xxx.jar –debug
2、application.properties添加debug=true
3、运行设置中增加debug为true的参数
1 |
|
具体配置
例如之前在web.xml文件中配置http编码的filter,如下:
1 | <!--配置编码--> |
现在使用自动配置,通过HttpEncodingAutoConfiguration实现。(路径如下:org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration),包含@ConditionalOnClass和@ConditionalOnProperty等,都是组合了@Condition元注解,使用了不同的条件。
1 |
|