#spring
#spring
Вопрос:
У меня есть иерархия классов, в которой интерфейс верхнего уровня или любая из конкретных реализаций могут быть запрошены для внедрения. В этой конкретной области кода преобладает автоматическое подключение, поэтому компоненты не привязаны к имени — только к классу.
Что я хотел бы сделать, так это избежать использования указания имени компонента или использования квалификатора при запросе конкретной реализации. Это довольно уникальная ситуация, когда класс описывает контекст использования, и будет доступен только один из этого класса. Есть ли способ подключиться к механизму разрешения компонентов Spring, чтобы указать, какой компонент использовать? В его нынешнем виде он находит x 1 допустимых совпадений, где x — родительские классы в иерархии классов.
Мне кажется, что лучший способ добиться этого — использовать CustomAutowireConfigurer для установки моего собственного AutowireCandidateResolver для всех BeanFactorys. Существует ли другая реализация FactoryBean, которая была бы проще? В принципе, я хотел бы увидеть DependencyDescriptor, прежде чем решать, какой компонент возвращать.
Ответ №1:
Вы пробовали простой FactoryBean
:
public class XyzFactoryBean implements FactoryBean<TopLevelInterface> {
@Override
public TopLevelInterface getObject() throws Exception {
if( life is good ) {
return new LifeIsGood();
} else
return new LifeIsBetterThanGood();
}
@Override
public Class<? extends TopLevelInterface> getObjectType() {
if( life is good ) {
return LifeIsGood.class;
} else
return LifeIsBetterThanGood.class;
}
@Override
public boolean isSingleton() {
return false;
}
}