web-dev-qa-db-ja.com

1つのBeanで使用するために複数のファイルからSpringプロパティを収集する方法

私はまだSpringに頭を抱えていないので、この質問が意味をなさない場合は訂正してください...

PropertyPlaceholderConfigurerがあります

<bean id="rdbmPropertiesPlacholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="false">
    <property name="location" value="classpath:/properties/rdbm.properties" />
</bean>

そして、私は豆が注入されていると思いますか?

<bean id="PortalDb" class="org.Apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${hibernate.connection.driver_class}" />
    <property name="url" value="${hibernate.connection.url}" />
    <property name="username" value="${hibernate.connection.username}" />
    <property name="password" value="${hibernate.connection.password}" />
    ...

私が欲しいのは、ユーザー名/パスワードで別のプロパティファイルを指す2番目のプレースホルダーです。これにより、プロパティを2つの異なるファイルに分割できます。次に、データベース接続情報をdbユーザー名/パスワードから分離することができ、一方をソース管理でき、もう一方をソース管理できません。

基本的に、別のIDとファイルでrdbmPropertiesPlaceholderをコピーしてプロパティにアクセスしようとしましたが、機能しません。

このコードは、uPortalオープンソースWebポータルプロジェクトからのものです。

16

この表記を使用すると、複数のファイルを指定できます。

 <bean id="rdbmPropertiesPlacholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="false">
     <property name="locations">
       <list>
           <value>classpath:/properties/rdbm.properties</value>
           <value>classpath:/properties/passwords.properties</value>
       </list>
    </property>
 </bean>

Propertyplaceholderconfigurererは、これらすべてをマージして1つしかないように見えるため、Bean定義はプロパティの出所を認識しません。

28
krosenvold

Org.springframework.beans.factory.config.PropertyPlaceholderConfigurerはこれを行うことができます(すでに回答済みです。名前の間隔を利用して、両方のファイルから同じ名前のプロパティを曖昧さなく参照できるようにすることをお勧めします。あなたの例では、これを行うことができます:

<bean id="generalPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:/properties/general.properties"/>
</bean>

<bean id="db.PropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:/properties/rdbm.properties" />
    <property name="placeholderPrefix" value="$db{" />
    <property name="placeholderSuffix" value="}" />     
</bean>

コンテキストファイルで、$ {someproperty}を使用して一般プロパティを参照し、$ db {someproperty}を使用してrdbmプロパティを参照できるようになりました。

これにより、コンテキストファイルが開発者にとってはるかにクリーンで明確になります。

17
Rolf