0

我需要用新的bean定义扩展spring applicatioContext xml文件,然后将它们的引用添加到列表中,这是一个bean的属性:基本applicationContext xml文件:

<bean id="myBean" class="com.example.MyBean">
    <property name="providers"> 
        <list>
            <ref bean="provider1">
        </list>
    </property>
</bean>
<bean id="provider1" class="com.example.Provider">

取决于应用程序的实例,我有不同的提供者,所以我需要将它们添加到列表中。现在我在数据库中有额外的 bean 定义,并用于BeanFactoryPostProcessor将它们添加到上下文中,然后将对它们的引用添加到提供者列表中。但是我使用@Transactional注释myBean和自动事务管理(tx:annotation-driven)并且由于使用BeanFactoryPostProcessor事务注释没有被处理。

所以我需要另一种方法来扩展应用程序上下文,然后是提供者列表。我可以使用什么?

我的想法是让xml文件一开始是空的,然后用数据库中的数据填充它,然后以某种方式在applicationContext中导入它。可能吗?

谢谢你的帮助

4

2 回答 2

0

您可以通过多种方式覆盖或扩展 bean 定义。简而言之,这是一种方法..

主应用程序上下文 xml:

<bean id="myBaseBean" class="com.example.MyBean" abstract="true">
    <property name="providers"> 
        <list merge="true">
            <ref bean="provider1" />
        </list>
    </property>
</bean>
<!-- default bean definition -->
<bean id="myBean" parent="myBaseBean">
    <property name="providers"> 
        <list merge="true">
        </list>
    </property>
</bean>
<bean id="provider1" class="com.example.Provider">

一些扩展的Application Context xml:

<bean id="myBean" parent="myBaseBean">
        <property name="providers"> 
            <list merge="true">
                <ref bean="someOtherProvider" />
            </list>
        </property>
    </bean>
 <!-- bean definition of some other provider -->

Transactions这与您必须像往常一样为每个其他 bean 处理事务无关。

注意:所有应用程序上下文文件都将根据您在创建ApplicationContext.

于 2012-11-07T10:03:52.607 回答
0

在 MyBean 类中使用 @PostConstruct 方法从数据库加载和填充提供者列表。

@PostConstruct
public void initialize() {
    providers.addAll(providerService.findAll());
}

将所有与数据库相关的代码放入Service/Dao类中,并用注解进行@Transactional注解

于 2012-11-07T10:00:34.077 回答