import com.baidu.disconf.client.DisconfMgrBean;
import com.baidu.disconf.client.DisconfMgrBeanSecond;
import com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
配置类模板
public abstract class DisConfigTemplate {
@Bean(destroyMethod = "destroy")
public DisconfMgrBean getDisconfMgrBean(){
DisconfMgrBean dmb = new DisconfMgrBean();
dmb.setScanPackage(getScanPackage());
return dmb;
}
public abstract String getScanPackage();
@Bean(destroyMethod = "destroy",initMethod = "init")
public DisconfMgrBeanSecond getDisconfMgrBean2(){
return new DisconfMgrBeanSecond();
}
@Bean(name = "reloadablePropertiesFactoryBean")
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
public ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean() {
ReloadablePropertiesFactoryBean propertiesFactoryBean = new ReloadablePropertiesFactoryBean();
propertiesFactoryBean.setSingleton(true);
propertiesFactoryBean.setLocations(getFiles());
return propertiesFactoryBean;
}
public abstract List<String> getFiles();
@Bean(name = "propertyPlaceholderConfigurer")
public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer(ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean){
PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer();
placeholderConfigurer.setIgnoreResourceNotFound(true);
placeholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
try {
Properties properties = reloadablePropertiesFactoryBean.getObject();
placeholderConfigurer.setProperties(properties);
} catch (IOException e) {
throw new RuntimeException("unable to find properties", e);
}
return placeholderConfigurer;
}
}
配置类
@Configuration
public class DisconfConfig extends DisConfigTemplate{
@Override
public List<String> getFiles() {
List<String> fileNames = Arrays.asList("classpath:edge-common.properties");
return fileNames;
}
@Override
public String getScanPackage() {
return "com.clife.gatewaybg";
}
}
获取spring的环境变量类
@Component
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);
}
}
重新加载变量到内存的类
@Component
@Scope("singleton")
@DisconfFile(filename = ScheDisconfUpdate.PROPERTIES_FILE)
@DisconfUpdateService(classes = { ScheDisconfUpdate.class })
public class ScheDisconfUpdate implements IDisconfUpdate
{
protected final static String PROPERTIES_FILE = "common.properties"; // 配置文件名
Logger logger = LoggerFactory.getLogger(ScheDisconfUpdate.class);
@Autowired
private SpringContextUtil springContextUtil; // ApplicationContext
@Override
public void reload() throws Exception
{
String a = null;
logger.info("重新加载disconf配置文件开始>>>>>>>>");
Map disconfPropertiesRelMap = new HashMap();
disconfPropertiesRelMap.put("test.test.test", "test");
// continue add properties...
resetPropertiesValues("com.controller.TestController", disconfPropertiesRelMap);
logger.info("重新加载disconf配置文件结束>>>>>>>>");
}
@SuppressWarnings(
{ "unchecked", "rawtypes", "static-access" })
private void resetPropertiesValues(String reflactSetPropClassName, Map disconfPropertiesRelMap)
{
if (!CollectionUtils.isEmpty(disconfPropertiesRelMap))
{
Set<Object> sets = disconfPropertiesRelMap.keySet();
for(Object disconfkey : sets){
Object propertiesKey = disconfPropertiesRelMap.get(disconfkey);
if (!StringUtils.isEmpty((String)disconfkey))
{
try
{
String afterChangedValue = getPropertiesValueByKay((String) disconfkey);
logger.info("disconf通过key:{}获取value:{}", disconfkey, afterChangedValue);
if (afterChangedValue != null)
{
Class involkPropertiesClass = Class.forName(reflactSetPropClassName);
String methodName = "set" + ((String) propertiesKey).substring(0, 1).toUpperCase() + ((String) propertiesKey).substring(1);
logger.info("disconf反射调用方法:{}", methodName);
Method method = involkPropertiesClass.getMethod(methodName, String.class);
method.invoke(springContextUtil.getApplicationContext().getBean(TestController.class), afterChangedValue);
logger.info("disconf修改重新修改属性:{}的值:{}", disconfkey, afterChangedValue);
}
}
catch (Exception e)
{
logger.error("disconf修改key值更新失败!e:{}", disconfkey, e.getMessage());
}
}
}
}
}
private String getPropertiesValueByKay(String key)
{
try
{
Map map = FileTypeProcessorUtils.getKvMap(SupportFileTypeEnum.PROPERTIES, PROPERTIES_FILE);
return map.get(key) == null ? null : map.get(key).toString();
}
catch (Exception e)
{
logger.error("disconf修改通过key:{}获取value失败!e:{}", key, e.getMessage());
return null;
}
}
}
测试类
@RestController
public class TestController {
@Value("${test.test.test}")
private String test;
@GetMapping(value = "/1/2")
public String gettest(){
return test+":woo";
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
分享到:
相关推荐
**SpringBoot集成Baidu Disconf详解** ...通过以上步骤,我们可以有效地将Disconf集成到SpringBoot项目中,实现配置的动态管理和高效运维。这种集成方式不仅简化了配置管理工作,也为系统的快速迭代提供了强大的支持。
springboot集成datax的demo,下载及能运行
**SpringBoot集成TDengine程序Demo**是一篇关于如何在SpringBoot应用中整合TDengine数据库的实战教程。SpringBoot以其简洁的配置和快速的开发能力深受Java开发者喜爱,而TDengine则是一款高性能、分布式、适用于...
springboot 集成kettle核心包依赖文件配置信息pom.xml
在本项目中,"springboot集成gbase8s小demo"是一个使用Spring Boot框架与GBase 8s数据库集成的示例应用。Spring Boot以其快速、开箱即用的特性,已经成为Java领域微服务开发的首选框架之一。GBase 8s是南大通用数据...
【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包...
**SpringBoot集成PageOffice** SpringBoot是一款由Pivotal团队提供的快速开发框架,它简化了在Spring框架上创建生产级Java应用的过程。PageOffice则是一款能够实现网页在线编辑Word、Excel、PPT等Office文档的Java...
SpringBoot集成OAuth2.0是将流行的OAuth2.0安全框架与SpringBoot应用程序相结合的过程,以便为API和Web应用提供安全的访问控制。OAuth2.0是一个授权框架,允许第三方应用在用户授权的情况下访问其受保护的资源,而...
"基于SpringBoot集成HBase过程解析" SpringBoot集成HBase是当前大数据处理和存储解决方案中的一种常见组合。HBase是基于Hadoop的分布式、可扩展的NoSQL数据库,能够存储大量的结构化和非结构化数据。SpringBoot则...
一般来说我们开发Elasticsearch会选择使用集成springboot,在网上找的springboot集成elasticsearch文章几乎都是extends ElasticsearchRepository的方式来实现。但是新版本ElasticsearchRepository里的方法基本上已经...
此springboot--demo集成了以下组件,demo如无法运行、或缺失相应组件demo无法调用可以私聊52fighting https://blog.csdn.net/qq_25073261/article/details/105517616 1. netty-websocket 2. spring-boot-admin-...
springboot集成Ureport2 与业务结合//报表名称要以其ReportProvider中要求的前缀开始, 比如http://localhost:8080/ureport2-demo/ureport/preview?_u=file:test.ureport.xml等。
基于Springboot集成yolo3构建基于神经网络的图片识别系统 基于Springboot集成yolo3构建基于神经网络的图片识别系统 基于Springboot集成yolo3构建基于神经网络的图片识别系统 基于Springboot集成yolo3构建基于神经...
在IT行业中,集成OpenOffice与SpringBoot框架来实现在线预览PPT、Word和Excel是一项常见的需求,尤其在开发Web应用时。OpenOffice是一个开源的办公软件套件,它提供了API,可以用来处理多种文档格式,包括ODF...
在本文中,我们将深入探讨如何在SpringBoot应用中集成Impala数据仓库系统,以及涉及到的相关配置和步骤。首先,我们来看看关键的组成部分: 1. **SpringBoot集成**: SpringBoot是基于Spring框架的一个轻量级开发...
基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip 基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip 基于Springboot集成yolo3构建基于神经网络的图片识别系统源码.zip 基于Springboot...
前言: ...三、springboot集成drools 1.pom文件引入依赖 org.drools drools-core 7.0.0.Final org.drools drools-compiler 7.0.0.Final org.drools drools-decisiontabl
springboot集成cmybaits-freemark项目基本结构demo,集成Eureka微服务的注册发现与消费服务demo,集成Ribbon负载均衡及应用demo,集成hystrix等断路由(雪崩效应)demo......
在本项目中,我们将深入探讨如何将流行的Java框架SpringBoot与高效的ORM库FluentMybatis集成,以便在实际开发中实现高效的数据操作。SpringBoot以其简洁的配置和强大的依赖管理能力,大大简化了Web应用的搭建过程。...