首页 > 解决方案 > 用于 Spring Boot 的 Typesafe @Qualifier 以避免字符串错误

问题描述

@Qualifier我被问过很多次(也问过自己),在 Spring Boot注释中避免容易出错的字符串的最佳方法是什么。(当然还有其他注释。)

有什么比散布@Qualifier("variantABC")@Qualifier("variantCBA")遍布代码更好的呢?例如,在 Spring Batch 中,我有限定符来区分不同的作业及其至少使用三四次的步骤。

使用带有(仅)常量字符串的接口或类真的是 [only|best|cleanest] 解决方案吗?

public class Variants{
  public final static String VARIANT_ABC = "variantABC";
  public final static String VARIANT_CBA = "variantCBA";
}

或者我们可以做得更好吗?

标签: spring-bootdependency-injectionspring-annotationsqualifiers

解决方案


我发现,对我来说最好的解决方案是使用我自己的注释而不是使用带字符串的注释。

为什么不使用字符串?

注释中的字符串有一个明显的缺点,即您很容易在一种或另一种用法中出现拼写错误。而且可能很难找到错误。

而且在代码中到处都有冗余字符串是不干净的。

为什么不使用常量接口或常量类?

为什么不应该使用可以在此处阅读的常量接口模式:https ://en.wikipedia.org/wiki/Constant_interface

甚至在问题中使用常量类也不是解决方案,因为它需要一个知道所有可能注释的地方。这听起来也不像是解耦和干净的代码。

带有自己注释的解决方案

对于我多次使用的每个@Qualifier("....")注释,我自己创建一个小注释:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Qualifier("variantABC")
public @interface VariantABC {}

这样我只需要输入VariantABC一次字符串并且不能输入错误。

我可以简单地使用注释而不是Qualifierbean 声明上的注释:

@Bean
@VariantABC
Foo getImplementationVariantABC() {...}

或所有类型的注射:

public MyService(@VariantABC Foo foo) {...}

// or

@Autowired
@VariantABC 
Foo foo;

( @Target, @Inheritedand@Documented和 @Inherited 是可选的。阅读 Javadoc 以了解更多关于它们的用途的信息。)


推荐阅读