Spring Boot 其实可以不需要配置就能运行,但实际的实现过程中,我们还是需要给它写一些配置,准确的说,是给包含第三方依赖的环境编写配置。
Maven - pom.xml
根据相关文档说明,构建 Spring Boot 项目建议使用 Gradle,但不排斥 Maven 创建项目。
在我的演示项目中,我使用了 Spring Boot + MyBatis + Thymeleaf 的环境。
以下是使用 Maven 创建 Spring Boot 项目所用的 pom.xml 文件配置内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| <!-- Spring Boot基础依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- Spring Boot JDBC 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Spring-MyBatis 支持 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- Thymeleaf 模板引擎支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- MySQL 连接器 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot 测试单元支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Restful 文档 -->
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-mockmvc</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot 开发工具包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- Groovy 支持 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--
使用Maven package时,如果指定了这个插件,打包会生成JAR文件,而不是WAR文件
启动Spring Boot是通过指定的BootApplication.main()来启动,所以使用JAR包直接运行
-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
|
Environment - application.yml
YAML (YAML Ain’t Markup Language),即“YAML 不是一种置标语言”,是所有编程语言的人性化数据序列化标准。
YAML 是 JSON 的一个超集,也是一种方便的定义层次配置数据的格式。只要将 SnakeYAML 库放到 classpath 下,SpringApplication 就会自动支持 YAML,以作为 properties 的替换。
简单来说,YAML 不像 xml 那样需要配置繁琐的标签和属性以及文档验证,也不像 properties 那样只有普通的 key/value。YAML 使用大纲的缩进表现形式,让配置项有明显的结构表示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # System configuration
server:
display-name: CRUD # 定义服务器的显示名称
port:
8888 # 定义可访问的端口,默认访问端口是8080
# 由于Spring Boot是内建Tomcat,所以没有了Tomcat的配置,取而代之的是在这里配置访问端口
# Datasource & Thymeleaf configuration
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver # 定义数据源使用的驱动类
username: root # 数据库用户
password: root # 数据库密码
url: jdbc:mysql://[server_address]:[port]/[schema_name] # 连接URL
thymeleaf: # 配置模板引擎
enabled: true # 开启模板引擎,默认true,这里配置其实可以不写这句
mode: HTML5 # 定义模板类型
encoding: utf-8 # 编码,不用多说了
content-type: text/html # 报文类型
cache:
false # 是否开启缓存,这里跟修改模板文件后自动部署有关
# 关闭之后如果对模板文件有修改,就会更新服务器上的文件
prefix: classpath:/templates/ # 访问前缀,默认是/template文件夹
suffix: .html # 访问后缀,可以改为其他的名称,默认就是.html
resources: # 资源文件绑定
static-locations: classpath:/static # 这里的配置可以使模板像调用本地文件一样调用到样式资源
|
MyBatis - bean & mapping xml
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生 Map 使用简单的 XML 或注解,将接口和 POJO 映射成数据库中的记录。
MyBatis 相比 Hibernate,其可控性几乎是完全的,程序员可以通过 mapping 配置,使程序不用回炉重造就能支持多个数据库的连接,并且有效控制对数据的操作。
本演示项目没有使用如 Druid、DBCP 等的数据库连接池工具,而是使用 Tomcat 数据库连接池,使用 Tomcat 连接池的配置相对简单,适合初学者入门(但为了数据库连接信息安全,更推荐使用 Druid)。对于使用数据库连接池的配置,会在今后撰文介绍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| @SpringBootApplication
@MapperScan("me.yuki.dao")
public class BootApplication {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource getDataSource() {
return new org.apache.tomcat.jdbc.pool.DataSource();
}
@Bean
public SqlSessionFactory getSqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(getDataSource());
PathMatchingResourcePatternResolver resolver
= new PathMatchingResourcePatternResolver();
sqlSessionFactory.setMapperLocations(resolver.getResources("/mapper/*.xml"));
return sqlSessionFactory.getObject();
}
@Bean
public PlatformTransactionManager getTransactionManager() {
return new DataSourceTransactionManager(getDataSource());
}
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
|
数据源配置 - 代码分析
类注解
1
2
| @SpringBootApplication // 标记该类是Spring Boot启动类
@MapperScan("me.yuki.dao") // 配置mapper扫描器扫描的包位置
|
getDataSource()
1
2
3
4
5
| @Bean // 注册为DataSource Bean
@ConfigurationProperties("spring.datasource") // 从yml取得节点spring.datasource下的配置
public DataSource getDataSource() {
return new org.apache.tomcat.jdbc.pool.DataSource(); // 从Tomcat获取DataSource
}
|
对应的 SpringFramework 配置如下(可能会有不同,参考的 xml 采用了 DBCP 配置数据源)
1
2
3
4
5
6
| <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${spring.datasource.driver-class-name}" />
<property name="url" value="${spring.datasource.url}" />
<property name="username" value="${spring.datasource.username}" />
<property name="password" value="${spring.datasource.password}" />
</bean>
|
getSqlSessionFactory()
1
2
3
4
5
6
7
8
9
10
11
12
| @Bean // 注册为SqlSessionFactory Bean
public SqlSessionFactory getSqlSessionFactory() throws Exception {
// <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
// <property name="dataSource" ref="dataSource" />
sqlSessionFactory.setDataSource(getDataSource());
PathMatchingResourcePatternResolver resolver
= new PathMatchingResourcePatternResolver();
// <property name="mapperLocations" value="classpath*:/mapper/*.xml" />
sqlSessionFactory.setMapperLocations(resolver.getResources("/mapper/*.xml"));
return sqlSessionFactory.getObject();
}
|
getTransactionManager()
1
2
3
4
5
6
7
8
9
10
| @Bean // 注册为PlatformTransactionManager Bean
public PlatformTransactionManager getTransactionManager() {
/*
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
*/
return new DataSourceTransactionManager(getDataSource());
}
|
Mapping.xml
MyBatis mapping 文件的配置与 SSM 的配置完全一样,只要把文件放到在 getSqlSessionFactory()中配置的 MapperLocation 文件夹之下,对应文件名匹配格式即可。