Пользовательское разрешение весенних бобов

#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;
    }
}