首页 > 解决方案 > @RefreshScope 副作用 - 自动配置、自动连接

问题描述

在 Spring Config Server 发生更改后,我正在使用 @RefreshScope 注释刷新我的 bean。这很好用,但在某些情况下会产生副作用。

第一种情况:我有一个实现 PermissionEvaluator (spring-security) 的 bean CustomPermissionEvaluator 以覆盖默认实现 (DenyAllPermissionEvaluator)。

import org.springframework.security.access.PermissionEvaluator;

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {

    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {

如果我用 @RefreshScope 注释 CustomPermissionEvaluator,Spring 将不再考虑它,并且在此自定义实现上选择默认实现。

第二种情况:我有以下bean:

@Bean
@Profile("enable_mongo_ssl")
public MongoClientOptions mongoClientOptions() {
    return getMongoClientOptionsBuilder()
            .build();
    }

如果我使用 @RefreshScope 对其进行注释,则 MongoAutoConfiguration 在构建 MongoClient 时不会使用它,而是使用没有证书的默认 mongoClientOptions。

最后一种情况:我定义了一个对象映射器:

@Bean
@Primary
public ObjectMapper defaultObjectMapper() {
    return ObjectMapperProvider.defaultObjectMapper();
}

如果我使用 @RefreshScope 对其进行注释,我会收到以下错误:

more than one 'primary' bean found among candidates: [defaultObjectMapper, jacksonObjectMapper]

我猜这些示例与 @RefreshScope 注释导致 bean 被代理的事实有关。但是有没有一种干净的方法来继续使用这个注释并使这些功能起作用?

标签: springspring-bootspring-securityspring-cloud

解决方案


推荐阅读