1、简介
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。
人们把 Spring Boot 称为搭建程序的脚手架
。其最主要作用就是帮我们快速的构建庞大的 Spring 项目,并且尽可能的减少一切 XML 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
2、优点
- 创建独立运行的Spring应用程序
- 可嵌入Tomcat,无需部署war文件
- 简化maven配置
- 自动配置Spring
- 提供生产就绪型功能,如:日志,健康检查和外部配置等;
- 不要求配置 XML;
- 非常容易和第三方框架集成起来。
3、缺点
- 版本更新快,可能出现较大的变化
- 因为约定大于配置,所以经常会出现一些很难解决就的问题。
4、使用IDEA创建SpringBoot工程
5、初始化项目分析
1、spring-boot-starter-parent
Spring Boot 提供了一个名为 spring-boot-starter-parent 的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!
- parent 项目中的 dependencyManagement 里的声明的依赖,只具有声明的作用,并不实现引入,因此子项目需要显式的声明需要用的依赖。
- 如果子项目想要使用夫项目的依赖必须进行声明,否则不会继承下来。
- 只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom;另外若子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。
2、Spring Boot Starter
Spring Boot 非常优秀的地方在于提供了非常多以 spring-boot-starter-* 开头的开箱即用的 starter 启动器。
- 官方常见的有一下几种:
- spring-boot-starter:核心启动器,提供了自动配置,日志和 YAML 配置支持。
- spring-boot-starter-aop:支持使用
Spring AOP
和AspectJ
进行切面编程。 - spring-boot-starter-freemarker:支持使用
FreeMarker
视图构建 Web 应用。 - spring-boot-starter-test:支持使用
JUnit
,测试Spring Boot
应用。 - spring-boot-starter-web:支持使用
Spring MVC
构建 Web 应用,包括RESTful
应用,使用Tomcat
作为默认的嵌入式容器。 - spring-boot-starter-actuator:支持使用 Spring Boot Actuator 提供生产级别的应用程序监控和管理功能。
- spring-boot-starter-logging:提供了对日志的支持,默认使用 Logback。
3、Web 启动器
这是 SpringBoot 提供的 Web 启动器,是一个快速集成 Web 模块的工具包,包含 Spring MVC,Jackson 相关的依赖,以及嵌入了 Tomcat9 服务器,默认端口 8080。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4、打包插件
<!-- pom.xml 中添加插件 -->
<build>
<plugins>
<!-- Spring Boot 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
6、SpringBoot参数配置
1、application.properties语法
// 修改端口号
server.port=80
// 设置session的失效时间
server.session-timeout=30
// 设置tomcat的字符集
server.tomcat.uri-encoding=UTF-8
// 设置数据库相关
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rbac
spring.datasource.username=root
spring.datasource.password=admin
2、application.yml 语法
server:
port: 80
session-timeout: 30
tomcat.uri-encoding: UTF-8
spring:
datasource:
url: jdbc:mysql://localhost:3306/crm
username: root
password: admin
driverClassName: com.mysql.jdbc.Driver
3、配置优先级
一个项目中可以有多个配置文件存放在不同目录中,此时他们会遵循固定的优先级来处理有冲突的属性配置,优先级由高到底,高优先级的配置会覆盖低优先级的配置。
由高到低的配置如下:
- 项目/config/application.properties
- 项目/application.properties
- classpath:config/application.properties
- classpath:application.properties
7、参数绑定
1、参数配置在自定义的 properties
# db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/rbac
jdbc.username=root
jdbc.password=admin
2、xml方式加载
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
3、使用JavaConfig配置
/**
* @PropertySource:把属性配置加载到 Spring 的环境对象中
* @Value:从 Spring 环境对象中根据 key 读取 value
*/
@Configuration
@PropertySource("classpath:db.properties")
public class JavaConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public MyDataSource dataSource() {
MyDataSource dataSource = new MyDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
4、参数配置在 application.properties
1、准备好 application.properties 和一个类 MyDataSource
# application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/crm
jdbc.username=root
jdbc.password=admin
@Data
public class MyDataSource {
private String driverClassName;
private String url;
private String username;
private String password;
}
2、@Value 绑定单个属性
- 在自定义类上绑定
@Component
@Data
public class MyDataSource {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
- 配置类
@Configuration
@ComponentScan("上面类所在的包路径")
public class JavaConfig { }
3、@ConfigurationProperties 绑定对象属性
若觉得上面的方式比较笨重,可以把前缀编写到 @ConfigurationProperties
属性上,并且设置类属性与需要绑定的参数名相同,可实现自动绑定,但是注意,若是使用测试类加载贴有 @Configuration
的配置类,则需要在配置类中添加 @EnableConfigurationProperties
注解;若是使用测试类加载贴有 @SpringBootApplication
的配置类,则不需要。
@Component
@ToString
@Setter
@ConfigurationProperties(prefix="jdbc")
public class MyDataSource {
private String driverClassName;
private String url;
private String username;
private String password;
}
@Bean
@ConfigurationProperties("jdbc")
public MyDataSource dataSource() {
return new MyDataSource();
}
4、使用 Spring 的 Environment 对象绑定属性
@Configuration
@PropertySource("classpath:db.properties")
public class JavaConfig {
/**
* environment:表示 Spring 的环境对象,该对象包含了加载的属性数据
* 可以获取到 application.properties 里面的参数,也可以获取到 @PropertySource 中的参数
* 但 application.properties 的优先级比 @PropertySource 高
*/
@Autowired
private Environment environment;
@Bean
public MyDataSource dataSource() {
MyDataSource dataSource = new MyDataSource();
dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getProperty("jdbc.url"));
dataSource.setUsername(environment.getProperty("jdbc.username"));
dataSource.setPassword(environment.getProperty("jdbc.password"));
return dataSource;
}
}