2013-07-22 1 views
1

У меня есть весенний проект, который содержит файл определения боб, содержащий компонент, который ссылается на другой компонент в качестве свойства, напримерВыбор какой bean ссылки в весну?

<bean id="aBean" class="org.test.class"> 
    <property class="org.test.A" autowire="byType"/> 
</bean> 

Этот файл определения боб будет импортирована другими весенними проектами, которые могут или не могут содержать бобы, которые расширяют org.test.A.

Что я хотел бы сделать, так это то, что если существует реализация расширения org.test.A (т.е. org.test.B), я хотел бы ссылаться на это в свойстве, иначе просто ссылку org.test. A.

Я занимаюсь некоторыми исследованиями по этому вопросу, но не пришел к ответу. Я попробовал написать пользовательский TypeFilter, но, похоже, мне разрешено возвращать true или false, следует ли возвращать класс или нет, вместо того, чтобы проверять все существующие определения bean-класса для класса и выбирать его.

Возможно ли такое? Если да, то как это сделать?

Идея состоит в том, чтобы избежать необходимости переписывать кучу определений bean-компонентов, которые ссылаются друг на друга (и в большинстве случаев будут одинаковыми в каждом проекте) и только записывают реализацию ссылочного компонента.

Любые материалы по этому вопросу оцениваются.

----- UPDATE 1 ------

Я дал ему попробовать с помощью @Primary и до сих пор не повезло. Нет ошибок, но используемый класс не тот, у которого есть @Primary.

Основной класс org.test.A расширяет другой класс (org.test.Whatever), то в моем контексте сервлета У меня есть следующие

<bean id="someID" class="org.someclass"> 
    <property name="realm" ref="testBean" /> 
</bean> 

И тогда я создал другой орг. test.B класс, который расширяет org.test.A и имеет как @Component, так и @ Primary, но не идет. Весна, похоже, загружает класс, но не использует его.

----- UPDATE 2 -----

Хорошо, я думаю, я знаю, что происходит. Класс, который я использую autowiring (который я не контролирую исходный код), имеет 2 метода набора, 1, который принимает один класс и тот, который берет коллекцию этого класса. Весна, кажется, думает, что, поскольку она находит несколько фасолей одного класса, она должна автоустанавливать набор, который берет коллекцию, а не автоустанавливает набор, который принимает один экземпляр.

Как указать в контексте xml, который я запускаю класс, какой метод должен быть автообновлен? Я не понимаю, почему весна не позволит мне использовать атрибут autowire для свойства. Я могу только установить autowire на bean, который оставляет весну, чтобы выбрать, какой метод использовать autwire. : S

+0

Вы можете оставить свой классный код с аннотациями –

+0

Прочтите мои обновления выше. Кажется, проблема в другом месте. Я создал какой-то единичный тест, чтобы ускорить процесс, и кажется, что весна делает некоторые махинации, которые действительно раздражают, и я не могу найти способ получить контроль над тем, какой метод является автонастройками. – ByteFlinger

+0

. Я не понимаю, что означают эти: Я указываю, в контексте xml, который я запускаю класс, какой метод должен быть автообновлен? –

ответ

4

Анкета для анкеты @Primary может помочь вам.

Если у вас есть более чем 1 implentation, то один аннотацию @Primary используется

+0

. Звучит так, как будто это может быть ответ, но будет ли он работать, если класс является подклассом класса, который нужен? В приведенном выше примере, если я установил @Primary на org.test.B, который случается с расширением org.test.A, будет ли он работать, поскольку org.test.A является просто подклассом этого? – ByteFlinger

+0

Насколько я знаю: да. если вы используете аннотацию autwire, экземпляр B будет создан и использован –

+0

ps: я подключил ссылку: http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/ context/annotation/Primary.html –

0

Вы должны использовать spring factory method for instantiating this bean. В качестве альтернативы можно использовать инъекцию метода поиска, например, в примере this.

+0

Я не уверен, как фабричный метод будет работать в этом случае, не могли бы вы уточнить? Что касается метода поиска, похоже, что класс должен был бы уже загрузить метод, который будет переопределен методом поиска, в то время как в моем случае класс имеет только метод setter. – ByteFlinger

0

Вот еще один способ сделать это с помощью SPEL У меня есть две реализаций типа DataStrategy с бобом IdS testDataStrategy и realDataStrategy

я могу выбрать между бобами, установив свойство «data.strategy» в файле свойств в мой проект Java.

<bean id="myBeanId" class="com.some.path.MyBeanClass" > 
    <property name="dataStrategy" value="# {'${data.strategy}'.equalsIgnoreCase('TEST_DATA') ? testDataStrategy : realDataStrategy}" /> 
</bean> 
Смежные вопросы