虽然springboot已经自动帮我们做了许多配置,让应用在不做任何配置的情况下就能运行起来,但是在实际的应用场景,我们仍然需要自己修改一些配置。本文主要讲述如何自定义配置,以及如何在应用中读取自定义配置。
当我们创建一个springboot应用时,系统默认为我们在src/main/java/resources目录下创建了application.properties文件。springboot支持properties和yml两种格式的配置文件,但是yml文件实在比properties强大太多,这里统一改成application.yml。
然后在application.yml中添加如下内容:
server:
port: 8888
然后在HelloController类中添加如下内容:
@Value("${server.port}")
private int port;
@Value("${server.port1:9999}")
private int port1;
@RequestMapping("/port")
public String port(){
return "server.port is " + port;
}
@RequestMapping("/port1")
public String port1(){
return "server.port1 is " + port1;
}
然后运行SpringbootDemoApplication的main方法,启动应用
打开浏览器输入http://127.0.0.1:8888/port,系统返回 server.port is 8888
打开浏览器输入http://127.0.0.1:8888/port1,系统返回 server.port1 is 9999
由上例可知,注入属性可以用@Value("${placeHolder}"),如果注入了不存在的占位符,系统启动会报错,可以通过@Value("${placeHolder:defaultValue}")解决
工欲善其事,必先利其器,在下一小节前,先补充说明一下几个开发者工具,也就是第一节使用Spring Assistant构建项目时,勾选的3个开发者工具
如果新建项目时没有勾选,也能通过pom文件添加
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
在src/main/java/resources目录下新建user.properties文件,内容如下:
user.name=henry
user.age=26
然后在com.henry包下新建config包,然后在config包下新建UserBean类,代码如下:
@Configuration
@PropertySource("classpath:user.properties")
@ConfigurationProperties(prefix = "user")
@Data
public class UserBean {
private String name;
private int age;
}
//一个@Data注解搞定,省去getter/setter/toString等方法,是不是很清爽
然后在com.henry.controller包下新建UserBeanController类,代码如下:
@RestController
public class UserBeanController {
@Autowired
private UserBean userBean;
@RequestMapping("/user")
public String user(){
return userBean.getName() +"-"+ userBean.getAge();
}
}
然后我们启动应用,打开浏览器输入http://127.0.0.1:8888/user,浏览器显示:
Henry-26
我们首先看一下UserBean上的几个注解
@Configuration 等同于@Component,@Service这些,声明该javabean被spring容器管理
@Data 代码简化注解
@PropertySource 指定从哪个配置文件读取属性
@ConfigurationProperties 指定前缀prefix = “user”,另外还有2个属性,ignoreUnknownFields默认值为true,找不到的字段忽略;ignoreInvalidFields默认值为false,不合法的字段会报错,比如java类中age字段是int类型,但是配置文件的age值为abc就会报错
SpringBoot应用在启动时读配置文件,生成javabean配置类,并给字段赋值,之后放到spring容器中管理,然后在应用的其他地方就能正常使用了,比如上例中通过@Autowired注解注入UserBeanController即可使用
实际开发的过程中,我们经常遇到多个环境切来切去的需求,下面讲一下此时application.yml如何配置
直接上代码
spring:
profiles.active: dev
---
spring:
profiles: dev
server:
port: 8080
---
spring:
profiles: stg
server:
port: 8888
---
spring:
profiles: prod
server:
port: 9999
如上,我们定义了3个环境,分别为dev、stg、prod,并指定了当前使用的环境为dev
直接启动应用,启动日志可以看到tomcat started on port(s): 8080 (http) with context path ''
假如我们想切到stg环境,有以下几种方法
通过ALT+SHIFT+F10快捷键进入edit configurations界面
经过如图2个步骤,再去运行SpringbootDemoApplication的main方法就读取的时stg的配置了。
maven 先clean,再install
打包完成后,打开idea的Terminal工具,输入命令
cd target
java -jar springboot-demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=stg
这里说明一点,指定应用参数的方式能覆盖application.yml中的配置
也就是说应用参数的方式(–spring.profiles.active=stg)优先级高于配置文件方式
配置文件方式高于jvm参数的方式(-Dspring.profiles.active=stg),可以动手试一下
试验之后再把环境切回到dev,后续教程默认是在dev环境开发运行