spring-boot - 用于 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";
}
或者我们可以做得更好吗?
解决方案
我发现,对我来说最好的解决方案是使用我自己的注释而不是使用带字符串的注释。
为什么不使用字符串?
注释中的字符串有一个明显的缺点,即您很容易在一种或另一种用法中出现拼写错误。而且可能很难找到错误。
而且在代码中到处都有冗余字符串是不干净的。
为什么不使用常量接口或常量类?
为什么不应该使用可以在此处阅读的常量接口模式: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
一次字符串并且不能输入错误。
我可以简单地使用注释而不是Qualifier
bean 声明上的注释:
@Bean
@VariantABC
Foo getImplementationVariantABC() {...}
或所有类型的注射:
public MyService(@VariantABC Foo foo) {...}
// or
@Autowired
@VariantABC
Foo foo;
( @Target
, @Inherited
and@Documented
和 @Inherited 是可选的。阅读 Javadoc 以了解更多关于它们的用途的信息。)
推荐阅读
- spring-integration - 如何为 spring 集成 dsl 流启用日志记录
- python - 自定义腐蚀结果与 OpenCV 腐蚀不匹配
- javascript - Posting to MongoDB, What am I doing wrong?
- ios - UITableViewCell 中的 UITextView 键盘问题
- c++ - 在 CMakeLists.txt 中包含目录的更好方法
- django - Django project-apps:你对实现一个真正的数据库方案有什么看法?
- python - 从 Python 中的较大/多行字符串中计算包含 *both* 的两个字符串的行数
- c++ - 使用函数打开文件,然后让其他函数使用该文件?
- python - 如何修复 Conv1D 的输入形状?- 音频分类模型
- spring-data-jdbc - Spring Data JDBC不生成派生查询