2013-08-13 6 views
7

Я пытаюсь использовать свойство заполнитель в качестве атрибута для @Qualifier следующим образом:Spring: Использование @Qualifier с имуществом Закончен Место

@Autowired 
@Qualifier("${beanName}") 
private MyBean myBean; 

Однако, это не работает, даже если свойство заполнитель доступен в качестве значения строки:

@Value("${beanName}") 
private String beanName; 

Что было бы хорошим обходным решением здесь, спасибо большое.

+0

Хорошее обходное решение зависит от вашей общей цели. Итак, какую общую проблему вы хотите решить? – Ralph

+0

Я использую Spring 3 ProprtySource, чтобы передать имя компонента в контекст при его загрузке. Это ключ: имя компонента должно быть передано в контексте приложения в качестве аргумента. Аргумент признается аннотацией @Value, но не Qualifier. – user1052610

+3

Но почему? Возможно, есть более подходящие альтернативы вашей цели. Если бы мне пришлось сделать слепое предположение, похоже, что профили фасоли Spring 3.1 могут подойти к тому, к чему вы стремитесь. –

ответ

1

Я не могу оставить комментарий, так что это мой ответ: (? Wich результата вы прицеливание)

Как Адам B сказал, может быть, вы можете использовать пружинные профили для достижения результата вы стремитесь.

Другая вещь, которую вы можете сделать, это:

настроить отображение (с помощью пружины UTIL пространства имен) в конфигурации контекста XML, как это:

<util:map id="mapId" key-type="java.lang.String" value-type="com.xxx.interface-or-superclass"> 
     <beans:entry key="${property.bean.name.1}" value-ref="bean1-defined-elsewehere"/> 
     <beans:entry key="${property.bean.name.2}" value-ref="bean2-defined-elsewehere"/> 
     <beans:entry key="${property.bean.name.3}" value-ref="bean3-defined-elsewehere"/> 
    </util:map> 

, то вы можете загрузить эту карту в бобе под названием например. "Com.xxx.BeanSelector"

@Value("#{mapId}") 
private Map<String, com.xxx.interface-or-superclass> myMap; 

и добавить к этому боба в Митос так:

public interface-or-superclass getBean(String beanName){ 
    return myMap.get(beanName); 
} 

ОК теперь вы можете иметь свой окончательный класс, похожий на этот:

@Autowired 
private BeanSelector beanSelector; 

@Value("${property.name.the.bean.you.want.to.use}") 
private String beanName; 

private interface-or-superclass myBean; 

то вы можете istantiate myBean (возможно, внутри метода afterPropertiesSet(), если вы реализуете интерфейс InitializingBean)

таким образом:

myBean = beanSelector.getBean(beanName); 
// then check ifthe bean is not null or something like that 

Хорошо это немного грязный и, возможно, вы можете действовать по-другому на основе чего вы хотите достичь, но это временное решение.

0

Просто попробуйте (не знаю, какая проблема решить). Вы можете использовать фиксированное имя bean-файла, как обычно (autowire with placeholder не поддерживается), но вы можете загрузить другую реализацию bean из разных xml на основе значения свойства.
. Else думает о решении, основанном на псевдониме bean. Мои 2 цента

9

Я столкнулся с точно такой же проблемой. Просто используйте Resource

@Resource(name="${beanName}") 
private MyBean myBean;