Spring @RefreshScope 不适用于 @Component

Posted

技术标签:

【中文标题】Spring @RefreshScope 不适用于 @Component【英文标题】:Spring @RefreshScope is not working with @Component 【发布时间】:2017-03-06 09:17:09 【问题描述】:

我有组件类和 pom.xml 依赖项,如下所示。属性永远不会被设置并保持为空。

@Component
@RefreshScope
public class SecurityProperties1  

    @Value("$ad.url")
    public String adUrl;

    @Value("$ad.manager.dn")
    public String managerDN;

    @Value("$ad.manager.password")
    public String managerPassword;

    @Value("$ad.search.base")
    public String searchBase;

    @Value("$ad.user.filter") 
    public String userFilter;


pom.xml

         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>1.2.1.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-commons -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
            <version>1.1.4.RELEASE</version>
        </dependency>

另外, 我的财产来源如下

@Component
public class CustomPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer 

    @Override
    protected String resolvePlaceholder(String placeholder, Properties props) 
        return DynamicProperty.getProperty(placeholder);
    

     @Override
     protected String resolvePlaceholder(String placeholder, Properties props, int systemPropertiesMode) 
         return DynamicProperty.getProperty(placeholder);
     


【问题讨论】:

对于初学者,请停止混合 Spring Cloud 版本。而您的自定义 PropertyPlaceholderConfigurer 会破坏正确使用。 【参考方案1】:

如果有人遇到此问题,则对于较新版本: 确保您在类路径中具有 spring-cloud-starter-bootstrap 依赖项并在 bootstrap.properties 文件中添加 spring.application.name 属性 并使用 @RefreshScope 注释每个从配置服务器获取属性的类

【讨论】:

【参考方案2】:

我有同样的问题。我的解决办法:我加了proxymode = default注解

@Component
@RefreshScope(proxyMode = DEFAULT)
public class MyClass 

   @Value("$test.value")
   private String testValue;

  

【讨论】:

以上是关于Spring @RefreshScope 不适用于 @Component的主要内容,如果未能解决你的问题,请参考以下文章

@RefreshScope 不工作 - Spring Boot

Spring Cloud @RefreshScope 原理分析:代理类调用流程

Spring Cloud @RefreshScope 原理分析:扫描 Bean 定义

如何在 spring boot + cloud 中禁用 refreshScope 健康指示器?

Spring Cloud Config Server 并在整个 Spring Boot 应用程序上应用 @RefreshScope

Spring Cloud @RefreshScope 原理分析:代理类的创建