欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springboot项目 外部加载配置文件

程序员文章站 2022-06-23 18:38:37
...

一、springboot的配置文件放置在项目中,打包后文件内容就无法修改,此时还需要开发人员对项目中的文件修改后再打包部署,此过程较为麻烦。其实springboot项目的配置文件是可以放置在外部去加载,如果有些配置需要修改可以直接进行修改,但有一点问题是部分配置参数修改后需要重启jar包才能生效,比如端口,数据库的配置,因为这些配置在启动项目时只加载一次,后续不在加载了。

二、实现方式如下,假如外部的我配置文件放置在C盘的properties文件夹下,如果是Linux系统就没有盘符标志

@SpringBootApplication
@ComponentScan(value = "com.hgt.cj.protectionmanage",lazyInit = true)
@EnableSwagger2
@EnableScheduling
@PropertySource(value={"file:C:/properties/myapplication.properties"})
public class ProtectionManageApplication {
	public static void main(String[] args) {
		SpringApplication.run(ProtectionManageApplication.class, args);
	}
}

这种方式就实现了外部加载配置文件的方式,但只是这样加载的情况下可能每次修改配置文件中的任何参数都需要重启,不然参数不会生效,如果想要修改某些参数不用重启项目,此时可以使用动态加载配置文件

动态加载方式如下:

一、加载动态配置信息

@Configuration
public class DynamicConfig {
    //资源信息元数据:PropertySource包含name和泛型,一份资源信息存在唯一的name以及对应泛型数据,在这里设计为泛型表明可拓展自定.PropertySource在集合中的唯一性只能去看name
    public static final String DYNAMIC_CONFIG_NAME = "config";
    @Autowired
    AbstractEnvironment environment;

    @PostConstruct
    public void init() {
        environment.getPropertySources().addFirst(new DynamicLoadPropertySource(DYNAMIC_CONFIG_NAME, null));
//        System.out.println("初始化配置文件");
    }
}

二、动态加载配置文件

public class DynamicLoadPropertySource extends MapPropertySource {
    private static Map<String, Object> map = new ConcurrentHashMap<String, Object>(64);
    private static ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1);
    static {
        scheduled.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                map = dynamicLoadMapInfo();
            }
        }, 5, 10, TimeUnit.SECONDS);
    }

    public DynamicLoadPropertySource(String name, Map<String, Object> source) {
        super(name, map);
    }
    @Override
    public Object getProperty(String name) {
        return map.get(name);
    }

    protected static Map<String, Object> dynamicLoadMapInfo() {
        return mockMapInfo();
    }

    private static Map<String, Object> mockMapInfo() {
        Map<String, Object> map = new HashMap<String, Object>();
        map = getProperties();
        return map;
    }

    public static Map<String, Object> getProperties() {

        Properties props = new Properties();
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            InputStream in = new DefaultResourceLoader().getResource("file:C:/properties/myapplication.properties").getInputStream();
            props.load(in);
            Enumeration<?> en = props.propertyNames();
            while (en.hasMoreElements()) {
                String key = (String) en.nextElement();
                String property = props.getProperty(key);
                map.put(key, property);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}

三、使用方式

    @Autowired
    AbstractEnvironment environment;
    private PropertySource<?> config;
    @PostConstruct
    public void init() {
        config = environment.getPropertySources().get("config");//此处为初始化信息是给出的名字
    }
     String unitsUrl = (String)config.getProperty("out.unitsUrl");

     logger.info("unitsUrl==>:"+unitsUrl);
     String unitId = (String) config.getProperty("init.unit.id");
     logger.info("unitId==>:"+unitId);