Это экзотический вариант использования, поэтому для понимания требуется некоторое терпение и могут потребоваться экзотические решения.
Контекст
Я создаю библиотеку для использования с Spring, которая выполняет автоматические действия над конкретными экземплярами bean-компонентов, присутствующими в контексте, созданными методами @Bean
, а не @ComponentScan
. По возможности бины должны быть различимы не по типу, а по другим признакам, желательно по аннотациям фабричного метода.
Вот идеальный случай. Например. скажем, есть 2 метода производства бобов:
@Bean
public SomeType makeSome() {...}
@Bean
@Special
public SomeOtherType makeOther() {...}
Здесь второй компонент является особым из-за аннотации @Special
в методе, который его создал. Но возможен любой механизм, позволяющий сделать его различимым.
Затем я хочу каким-то образом получить только специальные компоненты.
Предостережение
Я знаю, что если бы все bean-компоненты реализовывали один и тот же интерфейс, я мог бы внедрить их по типу. Но это должно работать максимально прозрачно, требуя как можно меньше изменений в существующем приложении.
Потенциальные подходы
Вот два широких подхода, которые я имею в виду:
1) Подключитесь к процессу регистрации bean-компонентов и прозрачно оберните экземпляры bean-компонентов в какой-то контейнер (я совершенно уверен, что эта часть выполнима). Например.
public void registerBean(Object bean, ApplicationContext ctx) {
ctx.register(bean); //do the usual
ctx.register(new Wrapper(bean); //register it wrapped as well
}
Затем введите все все bean-компоненты типа Wrapper
. Проблема здесь, очевидно, в дублировании... В качестве альтернативы я мог бы сгенерировать экземпляр прокси на лету, который реализовал бы интерфейс Wrapper
, чтобы он мог одновременно действовать как исходный bean-компонент и как обертка. Я ведь сказал, что согласен и с экзотическими решениями, не так ли?
2) Spring уже отличает кандидатов bean-компонентов от зарегистрированных bean-компонентов (например, @ComponentScan
может фильтровать кандидатов по пакету, аннотациям и т. д.). Я надеюсь, возможно, подключиться к этому процессу и получить дескрипторы кандидатов, которые все еще содержат некоторые полезные метаданные (например, их фабричный метод), которые позволят мне позже различать эти экземпляры компонентов.
@Qualifier
? - person chrylis -cautiouslyoptimistic-   schedule 05.02.2018Qualifier
можно использовать в качестве мета-аннотации, это действительно правильный подход! Спасибо, что привели меня к этому. - person kaqqao   schedule 06.02.2018