常规的,在springboot中一般只需要拿appolo或者nacos里配置的属性就够了。
但是也有一些很特殊的场景,要拿到appolo或者nacos里配置的文件,比如有个第三方jar包提供的方法中,要求把properties配置文件路径传进去来初始化第三方jar包里需要用到的东西,这时候一般是把properties文件配置到appolo或者nacos里,但是如何直接拿到这个properties文件而不是里面的属性值呢?
思路
apollo里直接提供了把配置的相应namespace直接转换成file的方法:
ConfigFile file = ConfigService.getConfigFile(namespaceName, ConfigFileFormat.Properties);
String content = file.getContent();
再把这个content转换成输入流就可以用了
public InputStream getConfigInputStream() {
return new ByteArrayInputStream(Arrays.copyOf(content.getBytes("utf-8"), content.getBytes("utf-8").length));
}
如果只是想拿到里面某个namespace的属性,则可以:
Config c = ConfigService.getConfig(namespaceName);
c.getProperty(key, "");
key为属性key名,c.getPropertyNames()方法能拿到该namespace下面的所有属性,返回一个Set<String>集合,再遍历这个集合就能拿到所有属性。
nacos跟apollo的处理思路有点不一样,找了很多资料,貌似没有找到nacos里直接获取整个获取配置文件的方法,后面如果有同学找到了这个方法记得留言提醒我。
nacos在springboot启动的时候已经把所有配置文件都注入到了spring里。
第一种:可以直接用注解 @Value("${key}")来获取配置好的属性值
第二种:在java里获取:
新建SpringContextUtil实现org.springframework.context.ApplicationContextAware这个接口:
package com.ly.mp.project.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; // Spring应用上下文环境
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<?> clz) throws BeansException {
return (T) applicationContext.getBean(clz);
}
}
在启动类用注解导入该类:@Import({SpringContextUtil.class})
利用org.springframework.core.env.Environment类来直接获取属性:
Environment config = SpringContextUtil.getApplicationContext().getEnvironment();
String value = config.getProperty(key);
特殊需求
如果有这样一个需求,有个第三方的jar包要求初始化配置好的properties文件,只给了properties文件的路径传参,只能用文件路径的方式初始化这个第三方jar包,那么我们就必须保证项目里或者其他文件夹有这个properties文件才可以,而这些配置如果经常要变的话,最好也是配置在nacos或者apollo,如此看来,apollo是可以直接把配置的相应namespace直接转换成file,而nacos大概只能把所有属性手工生成一个新的properties文件来保存到本地了。
这个生成文件的过程,要在springboot启动之后立即执行:
那我们就要建一个配置类实现org.springframework.beans.factory.InitializingBean这个接口,重写afterPropertiesSet()方法:把需要启动后执行的逻辑放在里面,下面是一个示例:
package com.ly.mp.project.config;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.env.Environment;
import org.springframework.util.ResourceUtils;
import com.ly.mp.project.utils.SpringContextUtil;
public class VstkConfiguration implements InitializingBean {
//private static Logger logger = LoggerFactory.getLogger(VstkConfiguration.class);
@Override
public void afterPropertiesSet() throws Exception {
Environment config = SpringContextUtil.getApplicationContext().getEnvironment();
Properties pro = new Properties();// 生成实例
pro.setProperty("ServerURL", config.getProperty("ServerURL"));// 设置键值
pro.setProperty("DigestAlg", config.getProperty("DigestAlg"));
String path = "";
try {
path = ResourceUtils.getURL("classpath:").getPath() + "cssconfig.properties";
} catch (FileNotFoundException e) {
e.printStackTrace();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
pro.store(fos, "Init properties");// 向新文件存储
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
把这个类在启动类里注入:
@Bean
public VstkConfiguration vs() {
VstkConfiguration vs = new VstkConfiguration();
return vs;
}
如此,在启动的时候就可以在本地生成一个cssconfig.properties文件了。
于是乎就可以类似这样调用第三方接口(根据第三方jar包来定):
private DSign signDs() {
DSign dsign = new DSign();
dsign.initConfig(DsignServiceImpl.class.getClassLoader().getResourceAsStream("cssconfig.properties"));
return dsign;
}
private SymmEncrypt symEnc() {
String path = "";
try {
path = ResourceUtils.getURL("classpath:").getPath() + "cssconfig.properties";
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("path==" + path);
SymmEncrypt symEnc = new SymmEncrypt(path);
return symEnc;
}
网友评论