Параметризованная конфигурация компонента Spring

У меня есть иерархия бобов:

<bean id = "a">
  <property name = "config" value = "something"/>
</bean>

<bean id = "b">
  <property name = "a" ref = "a"/>
</bean>

<bean id = "c">
  <property name = "b" ref = "b"/>
</bean>

<bean id = "d">
  <property name = "c" ref = "c"/>
</bean>

Все это работает. Однако предположим, что теперь мне нужна альтернативная иерархия, в которой я изменяю некоторые вещи в самом глубоком компоненте, в данном случае a.config. Чтобы все связать, мне теперь нужно удвоить всю иерархию, то есть:

<bean id = "a2">
  <property name = "config" value = "something2"/>
</bean>

<bean id = "b2">
  <property name = "a" ref = "a2"/>
</bean>

<bean id = "c2">
  <property name = "b" ref = "b2"/>
</bean>

<bean id = "d2">
  <property name = "c" ref = "c2"/>
</bean>

Я знаю два обходных пути:

  • Используйте свойства, т.е. что-то вроде этого

    <bean id = "a">
      <property name = "config" value = "${a.config}"/>
    </bean>
    
  • Используйте глобальные бины и переопределите их, т.е.

    <bean id = "a.config">
      <constructor-arg value = "something"/>
    </bean>
    
    <bean id = "a">
      <property name = "config" ref = "a.config"/>
    </bean>
    
    <!-- Override in another xml file -->
    <bean id = "a.config">
      <constructor-arg value = "something2"/>
    </bean>
    

Недостатки:

  • Свойства допускают только простые изменения значений. Например. Я не могу изменить класс созданного компонента, если их свойства не совпадают
  • Переопределение является недетерминированным, и никто не хочет отлаживать проблемы, связанные с недетерминированным экземпляром Spring.

Есть ли другой способ сделать это более управляемым, как-то передать параметры?

Логически я ищу что-то в этом роде:

<bean id = "a">
  <property name = "config" ref-param = "a-config"/>
</bean>

<bean id = "b">
  <property name = "a" ref = "a"/>
</bean>

<bean id = "c">
  <property name = "b" ref = "b"/>
</bean>

<bean id = "d">
  <property name = "c" ref = "c"/>
  <param name = "a-config" value = "something"/>
</bean>

<bean id = "d2">
  <property name = "c" ref = "c"/>
  <param name = "a-config" value = "something2"/>
</bean>

Почему бы не использовать конфигурацию Java? Думаю, эта проблема вообще не критична, если вы используете конфиг Java и IDE.

Max Farsikov 14.08.2018 16:12

@MaxFarsikov желаю. Устаревший код.

levant pied 14.08.2018 18:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
87
0

Другие вопросы по теме