2012-11-07 45 views
0

我需要延长春天applicatioContext xml文件与新豆的定义,然后添加对它们的引用列出,这是一个Bean的属性: 基本的applicationContext XML文件:扩展Spring应用程序上下文的最佳方式是什么?

<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将它们添加到上下文中,然后将对它们的引用添加到提供程序列表中。但我在myBean和自动交易管理(tx:annotation-driven)上使用@Transactional注释,并且因为使用BeanFactoryPostProcessor,所以不处理交易注释。

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

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

感谢您的帮助你为myBean类

回答

0

使用@PostConstruct方法负载,可以从数据库填充提供商名单。

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

将所有数据库相关的代码放到服务/ DAO类与@Transactional注释

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"> 

一些extendedApplication上下文的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做你必须处理的事务像往常一样每个其他的豆。

注意:所有应用程序上下文文件将根据您在创建ApplicationContext时提到的文件名的顺序加载/覆盖。

相关问题