переопределение свойства из родительского компонента

#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 должен иметь возможность определять дерево зависимостей для всех компонентов.