美文网首页
springboot中获取apollo或者nacos里的配置文件

springboot中获取apollo或者nacos里的配置文件

作者: haiyong6 | 来源:发表于2021-01-30 13:43 被阅读0次

常规的,在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;
    }

相关文章

网友评论

      本文标题:springboot中获取apollo或者nacos里的配置文件

      本文链接:https://www.haomeiwen.com/subject/ubwhtltx.html