默认情况下,带@Component注释的bean可以通过简短的类名解析,首字母小写,例如class x.y.z.Foo -> "foo"。如果我们有多个bean实现相同的接口,则应通过@Qualifier注释(如@Qualifier("foo"))指定注入的bean。

但是,在重构时,可以将Bean从Foo重命名为Bar,并且应将@Qualifier内部的所有引用都相应地重命名,从@Qualifier("foo")重命名为@Qualifier("bar"),否则,在运行时会出错。

有没有一种方法可以帮助在运行时之前搜索此类bean,或者至少获得编译时错误或警告?

我现在看到的最好的方法是创建一个注册表类,并在其中保留所有bean名称:

public final class BeanNames {
     public static final String FOO = "foo";
     ...
}

@Component(BeanNames.FOO)
class Foo { ... }

class Baz {
   @Autowired
   @Qualifier(BeanNames.FOO)
   Foo foo;
   ...

最佳答案

您可以创建基于标准@Qualifier的自定义限定符注释:

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD,
         ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface QualifierFoo {}


然后用它注释您的组件类:

@Component
@QualifierFoo
class Foo { ... }


并像其他任何带有限定符的bean一样注入它:

class Baz {
   @Autowired
   @QualifierFoo
   Foo foo;
   ...


然后,当将Foo重构为Bar时,您要做的就是将限定符名称从QualifierFoo重构为QualifierBar

10-01 17:39