@ConfigurationProperties和@Component搭配使用后,可以让配置类
遇到一个新问题注解@ConfigurationProperties应用在类上时不能实现动态刷新,经过查阅相关资料后,总结了两个方法。@ApolloConfigChangeListener主要用来自动注册ConfigChangeListener
(1)通过RefreshScope实现刷新
配置类加上RefreshScope注解
@Component
@ConfigurationProperties(prefix = "order")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@RefreshScope
public class OrderProperties {
private Integer payTimeSeconds;
private Integer createFrequencySeconds;
private Integer timeOut;
@Override
public String toString() {
return "OrderProperties{" +
"payTimeSeconds=" + payTimeSeconds +
", createFrequencySeconds=" + createFrequencySeconds +
", timeOut=" + timeOut +
'}';
}
}
@RestController
public class ApolloController3 {
@Autowired
private OrderProperties orderProperties;
@Autowired
private RefreshScope refreshScope;
@RequestMapping("demo3")
public String testDemo3(){
return orderProperties.toString();
}
@ApolloConfigChangeListener(value = "application",interestedKeyPrefixes = "order.")//监听的是namespace
public void refresh(ConfigChangeEvent configChangeEvent){
//refreshScope.refresh(name)这个name为加了@ConfigurationProperties注解的Bean name
refreshScope.refresh("orderProperties");
Set<String> keySet = configChangeEvent.changedKeys();
for (String key:keySet) {
System.out.println("key的值为:"+key+",对应的值为:"+configChangeEvent.getChange(key));
}
System.out.println(orderProperties.toString());
}
}
(2)通过Spring的事件驱动基于EnvironmentChangeEvent实现刷新
OrderProperties配置类可以去掉@RefreshScope注解
@Component
public class OrderPropertyRefresh implements ApplicationContextAware {
@Autowired
private OrderProperties orderProperties;
@Autowired
private ApplicationContext applicationContext;
@ApolloConfigChangeListener(interestedKeyPrefixes = "order.")
public void refresh(ConfigChangeEvent changeEvent){
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
System.out.println(orderProperties.toString());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}