#spring #annotations
#spring #примечания
Вопрос:
Я пытаюсь преобразовать приложение из XML на основе проводки на основе аннотаций. Я ищу решения для следующего (упрощенного для этого вопроса):
Class A {
@Autowired
Object myProp;
}
Class B extends A {
// has an Object myProp from it's parent
}
В XML был компонент A и компонент B с родительским компонентом A. B точно такой же, но у него есть переопределенный myProp:
<bean class="A" name="a">
<property name="myProp" value-ref="someRef"/>
....
</bean>
<bean class="B" parent="a">
<property name="myProp" value-ref="someOtherRef"/>
</bean>
Как я могу сделать это с помощью аннотаций? В B нет кода, в котором я мог бы указать, какой компонент я хочу ввести в myProp.
Комментарии:
1. определите общий фабричный метод, не
@Bean
вызывая его из обоих@Bean
методов, и переопределите / измените то, что необходимо. Также наследование в компонентах не означает, что классы должны расширять друг друга! Наследование определения компонента не является наследованием в смысле Java !.2. где … в XML есть другие настройки, которые также актуальны для B, поэтому они подключены таким образом. Кроме того, компоненты используются в маршрутах apache camel, поэтому нет простого места для использования фабрики (или: код, который использует компоненты, не наш).
3. Почему сложно создать
@Configuration
класс сcreateBean
помощью метода, который вы вызываете из 2 мест. Вы можете создать конфигурацию xml, чтобы вы могли создать@Configuration
класс.4. итак, ответ таков: используйте класс @Configuration, чтобы определять компоненты вне их собственных файлов классов и без XML. спасибо!
Ответ №1:
@Configuration
class Config {
@Bean
public A a(SomeClass someClass) {
A a = new A();
a.myProp = someClass;
return a;
}
@Bean
public B b(SomeOtherClass someOtherClass) {
B b = new B();
b.myProp = someOtherClass;
return b;
}
@Bean
public SomeClass someClass() {
return new SomeClass();
}
@Bean
public SomeOtherClass someOtherClass() {
return new SomeOtherClass();
}
}
Комментарии:
1. Можете ли вы изменить пример на тот, в котором «новый объект ()» заменяется ссылками на разные компоненты? введенные компоненты имеют, например, разные уровни изоляции транзакций, поэтому мне действительно нужна ссылка на уже настроенный компонент вместо нового Object() .
2. Выполнено. Пожалуйста, ознакомьтесь с последними изменениями
3. хорошо, еще один вопрос: нужные мне компоненты определены как a
@Component
в их собственных файлах классов, поэтому мне нужно было бы получить ссылку на них, а не создавать их здесь.@Component
Компоненты также используются в других местах, и они автоматически подключаются к другим компонентам без классов конфигурации.4. Не имеет значения, как определены эти компоненты, они будут доступны в классе @Configuration . Единственным ограничением являются циклические зависимости — spring должен иметь возможность определять дерево зависимостей для всех компонентов.