Скажем, у меня есть следующий компонент:
<bean id="some-bean" class="com.icyrock.example.SomeBean">
<property name="pa1" value="va1"/>
<property name="pa2" value="va2"/>
<property name="pa3" value="va3"/>
<property name="pa4" value="va4"/>
<property name="pa5" value="va5"/>
<property name="pa5">
<bean class="com.icyrock.example.SomeOtherBean>
<property name="px1" value="vx1"/>
<property name="px2" value="vx2"/>
<property name="px3" value="vx3"/>
<property name="px4" value="vx4"/>
<property name="px5" value="vx5"/>
</bean>
</property>
</bean>
Я бы хотел разделить это на блоки вдоль линий:
<block id="b1">
<property name="pa1" value="va1"/>
<property name="pa2" value="va2"/>
<property name="pa3" value="va3"/>
</block>
<block id="b2">
<property name="pa4" value="va4"/>
<property name="pa5" value="va5"/>
</block>
<block id="b3">
<property name="px1" value="vx1"/>
<property name="px2" value="vx2"/>
</block>
<block id="b4">
<property name="px3" value="vx3"/>
<property name="px4" value="vx4"/>
<property name="px5" value="vx5"/>
</block>
<bean id="some-bean" class="com.icyrock.example.SomeBean">
<block-ref id="b1"/>
<block-ref id="b2"/>
<property name="pa5">
<bean class="com.icyrock.example.SomeOtherBean>
<block-ref id="b3"/>
<block-ref id="b4"/>
</bean>
</property>
</bean>
, где block
и block-ref
мнимые теги Spring просто для иллюстрации идеи.
Есть ли способ сделать это без:
- Изменение классов Java (например, для принятия карты свойств или подкласса)
- Использование чего-либо, чего еще не было в самой Spring (т. Е. Всего, что происходит в процессе построения некоторых фабрик / установщиков свойств / всего, что еще используется в контекстных файлах Spring) или около того
Цель состоит в том, чтобы повторно использовать определения (то есть блоки) без создания каких-либо отношений (например, отношений родитель-ребенок или тому подобное).Например, это стандартное определение источника данных JDBC:
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
(пример из здесь ).Если есть доступ к разным серверам, это может быть случай, когда они используют один и тот же драйвер (так что driverClassName
будет общим), и это также может быть случай, когда они используют одинаковые учетные данные (таким образом, username
и password
будет общим).Я хотел бы сделать что-то вроде:
<block id="driver-credentials">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</block>
<bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url1}"/>
<block-ref id="driver-credentials"/>
</bean>
<bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url2}"/>
<block-ref id="driver-credentials"/>
</bean>
<bean id="ds3" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url3}"/>
<block-ref id="driver-credentials"/>
</bean>
или что-то в этом роде.Очевидно, что в этом простом примере это может быть родитель-потомок, мне просто интересно решение смешанного типа.Практически то же самое, что Spring предлагает для нескольких файлов, за исключением уровня bean-компонента.
Мнения о том, почему выполнение вышеизложенного не было бы хорошим или альтернативные способы сделать это, приветствуются.