一、项目创建
我们使用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文件和yml文件。
1.properties
Properties属于传统配置文件,语法结构以key=value的形式存在,缺点是中文会乱码,需要将其转换为注ASCII。
2.yml
yml是YAML(YAML Ain't Markup Language)语言的文件,以空格的缩进程度来控制层级关系,大小写敏感。空格的个数无关紧要,只要左边空格对齐即可视为同一个层级,但是需要注意的是不能用tab代替空格。
鉴于yml这种方式看起来比较一目了然,且yml文件中文不会乱码,我们的项目主要使用yml文件进行配置,特殊情况使用properties文件配置。
四、yml配置文件详解
在商业项目开发过程中,对代码质量的把控都比较严格,所以通常会有三种配置环境,即开发环境、测试环境、生产环境,根据不同的环境类型配置相应的属性。
首先,删除工程创建后默认的application.properties文件,创建application.yml文件。我们以开发环境配置为例,在resources目录下创建application-dev.yml文件。具体如下:
application.yml配置如下:
默认使用开发配置spring: profiles: active: dev main: allow-bean-definition-overriding: true
其中active为dev默认就是加在开发环境的配置文件,也就是springboot启动会加载application-dev.yml内的配置项。allow-bean-definition-overriding: true
表示有相同bean的直接覆盖。
再来看下application-dev.yml文件:
#开发配置spring: profiles: dev
profiles为dev就是为了标识当前配置文件是开发环境,和application.yml文件中的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.yml配置文件中增加测试数据
#测试数据配置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>