默认情况下,带@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
。