具有@Value批注和单个方法的字段。我应该让它们都静止吗?为什么/为什么不呢?

问题描述 投票:0回答:2

我有一个简单的URL构建器类,其类具有通过@Value注释从属性中获取字段值的方法。

@Getter
@Component
public class UrlBuilder {

    @Value("${url.api}")
    private String apiUrl;
    @Value("${url.auth}")
    private String authUrl;

    public String buildApiUrl(String urlAppendix, Map<String, String> queryParams){
        UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(apiUrl + urlAppendix);
        if (!isEmpty(queryParams)){
            for (String key : queryParams.keySet()){
                builder.queryParam(key, queryParams.get(key));
            }
        }

        return builder.toUriString();
    }
}

是否有充分的理由使方法static并在静态字段上使用设置器值注入?到目前为止,我已经通过构造函数注入了UrlBuilder

java spring dependency-injection static
2个回答
0
投票

静态字段和静态注入通常是一种反模式,因为它们属于全局共享状态,并且会创建排序依赖关系,并偶尔会引起线程安全性问题。 (很难确保调用者在进行静态注入之前永远不会调用buildApiUrl方法。)如果您正在考虑使用non-static setter方法设置此静态字段,则尤其如此,因为这意味着在one实例上调用setter也会隐式地修改每个other实例。这是一个令人困惑的API;客户将根据惯例进行假设,除非真正检查代码,否则他们不会注意到他们的假设是错误的。

考虑使用静态字段的主要原因是,如果您的遗留代码未与依赖项注入框架集成在一起。在这种情况下,您可能需要通过创建单例适配器来解决不匹配问题,该适配器将调用从静态方法转发到依赖项注入的Bean。但是,您将想做的事越少越好。在可能的情况下,迁移旧代码以使用依赖项注入比将旧代码迁移以在依赖项注入周围使用笨拙的静态适配器要好。


0
投票

我通常不建议在Spring bean类中创建静态方法,通常在Spring框架中创建静态方法,而我不建议使用静态方法。

When to use static methods in Java?

  • 该方法中的代码不依赖于实例创建,并且不使用任何实例变量。
  • 特定的一段代码将由所有实例方法共享。
  • 该方法的定义不应更改或覆盖。您正在编写不应更改的实用程序类。

我会说您在这里不需要任何迭代或util方法,只需使用spring MultiValueMap

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("A", "B");
    map.add("C", "D");

    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("http://localhost:8080");
    builder.queryParams(map);   //http://localhost:8080?A=B&C=D
© www.soinside.com 2019 - 2024. All rights reserved.