application.properties多环境配置⽂件、jar包外部配置⽂件、配
置项加。。。
⼀、简介
spring boot项⽬application.properties⽂件存放及使⽤介绍
⼆、⽅法⼀多环境配置⽂件
我们⼀般都会有多个应⽤环境,开发环境、测试环境、⽣产环境,各个环境的配置会略有不同,我可以根据这个创建多份配置⽂件,由主配置⽂件来控制读取那个⼦配置
创建spring boot项⽬后可以同时创建多个.properties⽂件,只要符合它要求的格式即可
格式:application-{profile}.properties;{profile}是变量⽤于⾃定义配置⽂件名称
分别创建三个应⽤环境的配置和⼀个主配置
1、application.properties 主配置(以下是配置内容,这⾥的dev就是其他配置⽂件的标识名dev、test、prod)
# 具体使⽤那个配置⽂件的标识名称(格式:application-{profile}.properties;{profile}是变量⽤于⾃定义配置⽂件名称)
spring.profiles.active=dev
2、application-dev.properties 开发环境(以下是配置内容)
spring.application.name=tyh-demo-prop
# 开发环境端⼝
server.port=10001
3、application-test.properties 测试环境(以下是配置内容)
spring.application.name=tyh-demo-prop
# 测试环境端⼝
server.port=10002
4、application-prod.properties ⽣产环境(以下是配置内容)
spring.application.name=tyh-demo-prop
# ⽣产环境端⼝
server.port=10003
更改主配置中的spring.profiles.active=dev这个参数就可以切换不同⼦配置⽂件了
由于此⽅法.properties⽂件依然在jar中,我们修改时并不⽅便,⽽且太多信息暴露在开发中容易泄露,所以结合⽅法⼆进⾏使⽤
三、⽅法⼆jar包外部配置⽂件
我们在开发完成发布⽣产环境时往往都会修改⼀下配置⽂件的相关内容,⽽默认.properties配置⽂件会被封装到jar包中修改起来不⽅便,所以spring boot给了⼏个读取配置⽂件的位置,我们可以通过这个⽅式去从jar包外部修改配置⽂件
⼀般我们会将.properties放在resources⽂件夹内
spring boot会按以下顺序去寻配置⽂件
1、“当前⽬录”的/config⽂件夹下
2、“当前⽬录”下
3、classpath的/config⽂件夹下
4、classpath下
以下是图例解释:
当到配置⽂件后将不会再继续寻,也就说该⽂件优先级以下的配置⽂件将不会被读取,到即停⽌
“当前⽬录”指的是我们打成可执⾏jar包后,⼀般会⽤bat⽂件来启动,这个当前⽬录指的就是bat⽂件的⽬录
我们常规存放的位置就是优先级最低的位置,所以我们只需要再单独拷贝⼀份配置⽂件,放在bat的“当前⽬录”即可
四、配置项加密
我们的application.properties⽂件中会有很多敏感信息,如:数据库连接、缓存服务器连接等等,这些⽤户名密码都应该是外部不可见的,所以最好将其加密后存储
我们使⽤jasypt来进⾏加解密,⾸先先建⽴项⽬,我搭建了spring boot项⽬
1、添加l信息
<!-- 配置⽂件项加密 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2、在application.properties⽂件中增加配置项,需要jasypt来解密的密⽂需要⽤“ENC(......)”括起来
spring.application.name=tyh-demo-prop
server.port=10001
# 配置⽂件项加解密密码,此处注释,⽽放在代码中(放在代码中使加密密钥和密⽂分开)
#ptor.password=112233
# 模拟数据库连接帐号密码
spring.datasource.username=ENC(nm3F96GtUIwZUHzsP0Mp1A==)
spring.datasource.password=ENC(lmn7lAlePy1hZu505WO0xQ==)
3、程序启动类,默认jasypt的密钥是放在配置⽂件中但这样会导致密⽂和密钥都在配置⽂件中,所以我把密钥放在程序中@SpringBootApplication
public class App {
public static void main(String[] args) {
//设置配置⽂件项加密密钥(放在这⾥使加密密钥和密⽂分开)
System.setProperty("ptor.password", "112233");
SpringApplication.run(App.class, args);
}
}
4、使⽤注解的⽅式来注⼊配置⽂件中的配置项
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class SysConfig {
@Value("${spring.datasource.username}")
private String dbUsername;
@Value("${spring.datasource.password}")
private String dbPassword;
//⾃⼰⽣成get set⽅法
}
5、编写controller及action来调⽤⼀下
h.fig.SysConfig;
import ption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
spring怎么读取jar文件import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class TestController {
@Autowired
StringEncryptor encryptor;
@ResponseBody
@RequestMapping("/index")
public String index() {
pt("taiyonghai");
}
@Autowired
SysConfig sysConfig;
@ResponseBody
@RequestMapping("/getConfig")
public SysConfig getConfig() {
//spring boot⾃动注⼊就会将密⽂解密
return sysConfig;
}
}
由于其使⽤的是PBEWithMD5AndDES加密⽅式,所以每次加密出来的结果都不⼀样,所以很适合对数据进⾏加密
运⾏后,可以看到⾃动解密的配置项
五、配置项注⼊静态static与⾮静态属性
我们有很多编码需求需要使⽤.properties⽂件中⾃定义的配置项,传统使⽤Properties对象来操作,类似如下代码,
这种⽅式太过灵活我们不想使⽤的配置项可能也会被提取出来,⽽且当我们不想使⽤jar包内的配置⽂件,⽽是利⽤优先级使⽤外部的,这种直接读取的⽅式就很不⽅便,所以推荐使⽤@Value的⽅式来使⽤
public class SysConfigUtil {
private static Properties props;
static {
try {
// TODO:读取⽤户配置
Resource resource = new ClassPathResource("/application.properties");
props = PropertiesLoaderUtils.loadProperties(resource);
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getProperty(String key) {
return props == null ? null : Property(key);
}
}
还是刚才的项⽬,使⽤@Value来注⼊想让程序使⽤的配置项,⽽不想让程序使⽤的就不注⼊,这样来使配置项可控
1、我们在.properties⽂件中增加两个⾃定义配置项
spring.application.name=tyh-demo-prop
server.port=10001
# 配置⽂件项加解密密码,此处注释,⽽放在代码中(放在代码中使加密密钥和密⽂分开)
#ptor.password=112233
# 模拟数据库连接帐号密码
spring.datasource.username=ENC(nm3F96GtUIwZUHzsP0Mp1A==)
spring.datasource.password=ENC(lmn7lAlePy1hZu505WO0xQ==)
# 模拟其他⾃定义配置项
#tyh.url.web.admin=www.admin
tyh.url.web.agent=www.agent
2、@Value注⼊可以给静态属性也可以给⾮静态属性,具体根据使⽤场景⾃⾏决定,如果配置项可能不存在也可以设置默认值,避免程序⽆法启动
@Component
public class SysConfig {
@Value("${spring.datasource.username}")
private String dbUsername;
@Value("${spring.datasource.password}")
private String dbPassword;
/*
⾮静态属性注⼊(注⼊属性)
*/
//@Value的参数代表配置项的key,如果没有启动会报错,加上“:”为其设置默认值即可解决冒号后⾯的就是默认值内容,也可以直接:冒号后⾯空⽩就是空 @Value("${tyh.url.web.admin:www.abc}")
private String urlAdmin;
//###⾃⼰创建get/set⽅法###
/*
静态属性注⼊(注⼊set()⽅法)
*/
//使⽤@Component把当前类当作组件启动时注⼊该静态属性值,静态属性注⼊set()⽅法
public static String urlAgent;
@Value("${tyh.url.web.agent:}")
private void setUrlAgent(String urlAgent) {
SysConfig.urlAgent = urlAgent;
}
}
3、使⽤时⾮静态属性使⽤Autowired注⼊,静态属性直接取值
//⾮静态属性注⼊取值(必须使⽤Autowired注⼊)
@Autowired
SysConfig sysConfig;
public void test() {
/
/静态属性注⼊取值(直接获取)
String str = SysConfig.urlAgent;
}
推荐使⽤@Value来注⼊配置项进⾏使⽤,便与后续接⼊Apollo等配置管理中⼼进⾏配置统⼀管理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论