这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
背景
如果我们使用的配置中心是apollo的话我们经常会遇到这样的问题,就是动态更新配置Bean
动态更新配置bean
动态更新配置bean其实是很简单的,但是单纯依赖spring boot是不行的,我们还需要添加额外的依赖,就是spring cloud相关依赖
 具体一个简单的实例如下
依赖
<dependencies>
		
		<dependency>
			<groupId>com.ctrip.framework.apollo</groupId>
			<artifactId>apollo-client</artifactId>
			<version>2.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-context</artifactId>
		</dependency>
		
	</dependencies>
spring boot 和 spring cloud版本使用统一依赖管理具体可以看后面的源码
配置bean
- TestProperties
@ConfigurationProperties("spring.cloud.test")
@ToString
@Data
public class TestProperties {
	
	private String name;
}
动态刷新
- ApolloPropertiesChangedListener
@Configuration
@Slf4j
public class ApolloPropertiesChangedListener implements ApplicationEventPublisherAware {
	public static final String NAMESPACE = "test.yml";
	private ApplicationEventPublisher publisher;
	@ApolloConfigChangeListener(value = NAMESPACE)
	public void onChange(ConfigChangeEvent changeEvent) {
		publisher.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
	}
	@Override
	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
		this.publisher = applicationEventPublisher;
	}
}
我们也可以通过注解的其他属性刷新指定的key前缀或指定的key
 
测试controller
@RestController
@RequestMapping
@EnableConfigurationProperties(TestProperties.class)
@RequiredArgsConstructor
public class TestController {
	private final TestProperties testProperties;
	
	@GetMapping("/test")
	public void test() {
		System.out.println(testProperties);
		
	}
}
测试
http://localhost:8090/test
我们调用接口然后修改apollo的数据
 
可以发读取到的配置修改成功了
源码
githu: https://github.com/weihubeats/weihubeats_demos/tree/master/spring-boot-demos/spring-boot-apollo



















