一, 项目创建
我们使用 IDEA 工具开发后台项目, 具体的安装过程自行搜索, 比较简单. 安装完成后打开 IDEA, 菜单栏选择 File->New-Project, 选择 Spring Initializr, 默认选择 Default, 然后 Next.
填写好项目基本信息, 选择 Java Version 为 8 以上, 然后 Next.
选择 web, 右边勾选 Web 依赖.
选择 SQL, 右边勾选 MySQL,JDBC,MyBatis 依赖, 然后 Next.
填写项目名称和路径, 点击完成即可创建项目.
二, 项目目录
项目目录结构如下:
DemoApplication 为工程启动的入口类, application.properties 为配置文件, pom.xml 为 maven 项目依赖.
我们看一下 pom.xml 依赖, 里面包含我们创建项目过程中选择的依赖.
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <scope>runtime</scope>
- </dependency>
MySQL 的依赖我们看到有这么一段 < scope>runtime</scope>.
关于 scope 的分类, 参照网上的讲解:
1,complie
编译域, 这个是 Maven 中 scope 的默认值, 默认就是使用这个值. compile 表示被依赖项目需要同当前项目编译时一起进行编译, 项目测试期以及本项目运行时期同样生效, 打包的时候需要包含进去.
2,test
测试域, 指的是被依赖的项目仅在项目进行测试的时候生效, 一般将日志等依赖包 (如: logback,Junit,Slf4j 等) 配置为 test, 项目运行时不生效.
3,runtime
运行域, 指的是被依赖项目不会参与项目的编译, 但项目的测试期和运行时期会参与.
4,provide
provided 指的是打包的时候可以不必打包进去, 别的容器会提供. 配置 provide 的被依赖项目会参与编译, 测试, 运行等周期, 但是在打包阶段未参与.
5,system
系统域, 效果等同于 provided 相同, 差别是依赖项不会从 maven 远程中央仓库下载, 而是从本地 Maven 仓库中获取.
三, 配置文件概述
Spring Boot 提供了两种常用的配置文件, 分别是 properties 文件和 YAML 文件.
1.properties
Properties 属于传统配置文件, 语法结构以 key=value 的形式存在, 缺点是中文会乱码, 需要将其转换为注 ASCII.
2.YAML
YAML 是 YAML(YAML Ain't Markup Language)语言的文件, 以空格的缩进程度来控制层级关系, 大小写敏感. 空格的个数无关紧要, 只要左边空格对齐即可视为同一个层级, 但是需要注意的是不能用 tab 代替空格.
鉴于 YAML 这种方式看起来比较一目了然, 且 YAML 文件中文不会乱码, 我们的项目主要使用 YAML 文件进行配置, 特殊情况使用 properties 文件配置.
四, YAML 配置文件详解
在商业项目开发过程中, 对代码质量的把控都比较严格, 所以通常会有三种配置环境, 即开发环境, 测试环境, 生产环境, 根据不同的环境类型配置相应的属性.
首先, 删除工程创建后默认的 application.properties 文件, 创建 application.YAML 文件. 我们以开发环境配置为例, 在 resources 目录下创建 application-dev.YAML 文件. 具体如下:
application.YAML 配置如下:
默认使用开发配置 spring: profiles: active: dev main: allow-bean-definition-overriding: true
其中 active 为 dev 默认就是加在开发环境的配置文件, 也就是 springboot 启动会加载 application-dev.YAML 内的配置项. allow-bean-definition-overriding: true
表示有相同 bean 的直接覆盖.
再来看下 application-dev.YAML 文件:
# 开发配置 spring: profiles: dev
profiles 为 dev 就是为了标识当前配置文件是开发环境, 和 application.YAML 文件中的 active 相对应.
五, 配置文件取值
当我们需要给配置文件自定义内容, 在其他类中获取相应值的时候, 我们通常有两种方式取值, 即 ConfigurationProperties 和 Value.
Spring Boot 通过 ConfigurationProperties 注解从配置文件中获取属性, Spring 的 Value 注解也可以获取属性. 区别在于:
ConfigurationProperties
1.ConfigurationProperties 可以从配置文件中批量注入属性.
2. 支持获取复杂的数据类型.
3. 对属性名匹配的要求较低.
4. 支持 JAVA 的 JSR303 数据校验.
5. 不支持强大的 SpEL 表达式.
Value
1. 只能一个个配置注入值.
2. 不支持数组, 集合等复杂的数据类型.
3. 不支持数据校验.
4. 对属性名匹配有严格的要求.
5. 支持 SpEL 表达式.
由于使用的是 Spring Boot, 我们还是重点讲解 ConfigurationProperties
注解取值.
首先导入依赖
<dependency> <groupId>org.springframework.boot </groupId> <artifactId>spring-boot-configuration-processor </artifactId> <optional>true </optional></dependency>
在 application-dev.YAML 配置文件中增加测试数据
# 测试数据配置 home: province: 辽宁 city: 大连 desc: 我居住在 ${home.province} ${home.city}
新增匹配类
新建包名为 property, 新建类文件 HomeProperties, 如图:
HomeProperties 类如下:
@Component@ConfigurationProperties(prefix = "home")public class HomeProperties { /** * 省份 */ private String province; /** * 城市 */ private String city; /** * 描述 */ private String desc; public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "HomeProperties{" + "province='" + province + '\'' + ", city='" + city + '\'' + ", desc='" + desc + '\'' + '}'; }}
@Component 注解表明是组件,@ConfigurationProperties 注解表示从配置文件取值, prefix 表示读取的配置信息的前缀, 和自定义配置文件中的值相对应.
使用方法:
在需要使用 HomeProperties 的类中注入, 然后直接 get 相应属性即可.
- public class Test {
- @AutowiredHomeProperties homeProperties;
- ...
- ...
- homeProperties.getProvince();
- }
6, 问题记录
@ConfigurationProperties 注解出现 "Spring Boot configuration annotation processor not found in classpath"
解决方法:
在 pom 文件中增加
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- <optional>true</optional>
- </dependency>
来源: http://www.jianshu.com/p/65802599d4ef