Как избежать изменения имени компонента во время рефакторинга, если он внедрен с помощью @Autowired + @Qualifier - PullRequest
0 голосов
/ 04 декабря 2018

По умолчанию бины, помеченные @Component, могут быть разрешены с помощью короткого имени класса с первой буквой в нижнем регистре, например, class x.y.z.Foo -> "foo".Если у нас более одного компонента, реализующего один и тот же интерфейс, внедренный компонент должен быть указан с помощью аннотации @Qualifier, например @Qualifier("foo").

Однако при рефакторинге компонент может быть переименован из Foo в * 1008.* и все ссылки внутри @Qualifier должны быть соответственно переименованы, с @Qualifier("foo") до @Qualifier("bar"), в противном случае мы получим ошибку во время выполнения.

Есть ли способ облегчить поиск таких бинов перед выполнением или, по крайней мере, получить ошибку или предупреждение во время компиляции?

Лучший способ, который я вижу сейчас, - это создать класс реестра и хранить там все имена бинов:

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

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

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

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете создать пользовательскую аннотацию квалификатора, основанную на стандарте @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.

...