Nacos SpringBoot 实现Bean的自动刷新

710 阅读1分钟

环境和依赖

由于 nacos-config-spring-boot-starter 缺失对 Bean Auto-Reresh的支持,下文将通过spring-cloud-context的引入提供对bean自动刷新能力的支持

<spring-boot.version>2.6.5</spring-boot.version>
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.11</version>
</dependency>
<!--引入SpringCloud中的@RefreshScope来实现bean的自动刷新-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-context</artifactId>
    <version>3.0.3</version>
</dependency>

NacosConfig 监听器

@Autowired
private ContextRefresher contextRefresher;

@NacosConfigListener(dataId =  "${nacos.config.data-id}")
public void aaaa(String msg){
    System.out.println("refresh"+msg);
    new Thread( () -> contextRefresher.refresh() ).start();
}

Mysql配置类和JdbcTemlate Bean 自动刷新

@Configuration
@Data
@RefreshScope
@ConfigurationProperties(prefix = "mysql")
public class MysqlBean {
    private String url;
    private String name;
    private String password;
}
@Configuration
public class DbConf {
    @Bean
    @RefreshScope
    public DataSource dataSource(MysqlBean mysqlBean){
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl(mysqlBean.getUrl());
        config.setUsername(mysqlBean.getName());
        config.setPassword(mysqlBean.getPassword());
        config.setMaximumPoolSize(20);
        config.setMaxLifetime(TimeUnit.SECONDS.toMillis(60));
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return new HikariDataSource(config);
    }
    @Bean
    @DependsOn("dataSource")
    @RefreshScope
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }
}