SpringBoot(二)application.properties配置文件详解

目录

新建子工程

.properties配置文件

@Value方式

@ConfigurationProperties方式

配置文件的位置

使用 spring.profiles.active来分区配置


SpringBoot版本:2.1.1

前言

上篇入门教程中,一点配置文件的影子都没见到,因为Spring Boot使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

新建子工程

进入正题,在上次的父工程下新建子工程SpringBoot_PropertiesFile,只记录配置文件的使用,所以这里建的是jar包,在pom文件中就加入spring-boot-starter依赖,官网描述是:核心启动器,包括自动配置支持,日志记录和YAML。

下面是pom文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.eastcom</groupId>
		<artifactId>SpringBoot_Demo</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>SpringBoot_PropertiesFile</artifactId>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>
</project>

.properties配置文件

项目建完了再创建配置文件,在resources下新建application.properties配置文件,在配置文件中你可以用spring.然后快捷键稍微过一眼配置项,这是官网列出来的常用应用属性配置:官网常用应用属性配置

Spring Boot支持.properties和.yml形式的配置文件,.properties形式配置文件优先级高于.yml形式的配置文件,默认的配置文件是application.properties

当然你也可以自定义配置项,比如下面这样在配置文件中加三条配置:

那么如何读取配置呢?两种方式分别用到@Value和@ConfigurationProperties这两个注解。

@Value方式

新建java类MyConfiguration_Value,代码如下:

@Component
public class MyConfiguration_Value {
	
	//@Value默认要有配置项,配置项可以为空,若没有配置项要指定默认值,:后的boot为默认值
	@Value("${com.eastcom.name:boot}")
	private String name;
	
	@Value("${com.eastcom.version}")
	private String version;
	
	@Value("${com.eastcom.listName}")
	private List<String> listName;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getVersion() {
		return version;
	}
	public void setVersion(String version) {
		this.version = version;
	}
	public List<String> getListName() {
		return listName;
	}
	public void setListName(List<String> listName) {
		this.listName = listName;
	}
	@Override
	public String toString() {
		return "MyConfiguration_Value [name=" + name + ", version=" + version + ", listName=" + listName + "]";
	}
}

注解中放的就是配置项,@Value默认要有配置项,配置项可以为空,若没有配置项要指定默认值,:(冒号)后的boot为默认值。

新建Application主类,代码如下:

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
		MyConfiguration_Value myConfiguration_Value = context.getBean(MyConfiguration_Value.class);
		System.out.println(myConfiguration_Value.toString());
		context.close();
	}
}

运行看一下结果,可以看到配置已经读到了。

再试一下@Value的默认值,把name在配置文件中去掉,在运行,可以看到name变成了boot。

@ConfigurationProperties方式

把name重新加上,新建MyConfiguration_Properties类,代码如下:

@Component
@ConfigurationProperties(prefix="com.eastcom")
public class MyConfiguration_Properties {
	
	private String name;
	
	private String version;
	
	private List<String> listName;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getVersion() {
		return version;
	}
	public void setVersion(String version) {
		this.version = version;
	}
	public List<String> getListName() {
		return listName;
	}
	public void setListName(List<String> listName) {
		this.listName = listName;
	}
	@Override
	public String toString() {
		return "MyConfiguration_Properties [name=" + name + ", version=" + version + ", listName=" + listName + "]";
	}
	
}

@ConfigurationProperties的prefix属性值是配置项前缀,然后类中的属性名就是配置项的名字,在Application类中添加代码,代码如下:

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
		MyConfiguration_Value myConfiguration_Value = context.getBean(MyConfiguration_Value.class);
		System.out.println(myConfiguration_Value.toString());
		
		MyConfiguration_Properties myConfiguration_Properties = context.getBean(MyConfiguration_Properties.class);
		System.out.println(myConfiguration_Properties.toString());

		context.close();
	}
}

再启动项目,输入如下,可以看到两种方式都成功了。

@Value适合配置少单个注入,@ConfigurationProperties适合全量或批量注入。

配置文件的位置

配置文件的位置也可以放到不同的位置,当然,不同的位置配置文件读取的优先级肯定也不同,下面是配置文件可以放置的四个位置,优先级依次从高到低

  1. file:./config/                项目当前路径下的config子目录
  2. file:./                           项目当前目录
  3. classpath:/config/       类路径下的config目录
  4. classpath:/                  类路径下

在这四个位置新建四个配置文件,然后在项目中看一下这四个位置,图中数字跟上面数字对应。

然后在每一个配置文件中添加一个配置com.eastcom.index,值跟图中的数字对应,分别是1,2,3,4。另外我把每个配置文件中都加上了上面的三个自定义配置,并把版本号稍微改成跟顺序对应。如下:

在Application类添加代码,如下:

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
		MyConfiguration_Value myConfiguration_Value = context.getBean(MyConfiguration_Value.class);
		System.out.println(myConfiguration_Value.toString());
		
		MyConfiguration_Properties myConfiguration_Properties = context.getBean(MyConfiguration_Properties.class);
		System.out.println(myConfiguration_Properties.toString());
		
		System.out.println(context.getEnvironment().getProperty("com.eastcom.index"));
		context.close();
	}
}

控制台输出信息:

很明显,读取的是项目当前路径下的config子目录中的配置,其余的就不一一试了。

使用 spring.profiles.active来分区配置

上一篇博客中有讲到spring-boot-starter-parent提供的特性,其中就包括能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(例如: application-dev.properties 和 application-dev.yml,这个功能可以更好的配置不同生产环境下的配置文件)。
新建三个配置文件,分别为application-dev.properties(开发)、application-test.properties(测试)、application-prod.properties(生产)。

可以使用spring.profile.active配置项在application.properties配置文件中指定哪些配置文件处于活动状态,可以指定多个。

新建一个配置类MyActiveProfileConfig等会要用,代码如下:

@Configuration
public class MyActiveProfileConfig {
	
	@Bean
	public Runnable create() {
		System.out.println("default");
		return ()->{};
	}	
	@Bean
	@Profile("dev")
	public Runnable createDev() {
		System.out.println("dev");
		return ()->{};
	}
	@Bean
	@Profile("prod")
	public Runnable createProd() {
		System.out.println("prod");
		return ()->{};
	}
	@Bean
	@Profile("test")
	public Runnable createTest() {
		System.out.println("test");
		return ()->{};
	}
}

@Profile("dev")表示只有当启动的配置是开发环境的配置是才创建这个bean,@Profile也可以放在类上,意思是一样的,只有当启用某个配置文件是才去创建这个配置类中的bean。

为了跟上面说的分开,再重新创个主类AppActiveProfile吧,强迫症,全混一起感觉太乱了。代码如下:

@SpringBootApplication
public class AppActiveProfile {
	public static void main(String[] args) {
		SpringApplication application = new SpringApplication(AppActiveProfile.class);
//		application.setAdditionalProfiles("dev","prod");
		ConfigurableApplicationContext context = application.run(args);
		context.close();
	}
}

运行看打印信息。上面我设置启用的是dev和test,可以看到已经启用了,@Profile注解是生效了的。

当然你还可以通过代码设置启用哪些配置文件,把AppActiveProfile类中注释的代码取消注释,setAdditionalProfiles(String... profiles)方法同样可以设置多个值,参数是String,...表示可以有多个,自行去尝试。

至此,Sping Boot 配置文件就讲完了,有不足或者错误的地方欢迎指正。

项目源码:https://github.com/AiHePing/SpringBoot_Demo

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值