0

次のような Bean 配線の例があるとします。

<bean id="abstractTemplateBean" class="com.somepackage.AbstractTemplateOfSomething" abstract="true">

        <property name="templateproperties">
            <map merge="true">
                <entry key="componentCode">
                    <bean parent="someTemplate">
                        <property name="name" value="ThisIsTheValueForOverride" />
                    </bean>
                </entry>
            </map>
        </property>
    </bean>

    <bean id="concreteBean" parent="abstractTemplateBean">

    </bean>

定型文全体を記述せずに、 templatePropertiesマップのプロパティ名の値をオーバーライドする方法はありますか。次のような同じ種類のプレースホルダーを持つだけです:

    <bean parent="someTemplate">
            ...
                <property name="name" value="${this_is_place_holder}" />
            ...
    </bean>

そして、具体的な Bean が次のように宣言されたら、このプレースホルダーに値を提供します。

<bean id="concreteBean" parent="abstractTemplateBean">
    <property id="${this_is_place_holder}" value="concrete value for abstract template" />
</bean>

ありがとう

4

1 に答える 1

1

FactoryBean問題を解決するために使用するデモを作成するだけです

アイデアは、を使用してFactoryBean、プロパティからターゲット Bean を設定することです

詳細コード

PropertySetFactoryBean.java

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.FactoryBean;

import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

public class PropertySetFactoryBean implements FactoryBean{

    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    private Properties properties;

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    private boolean populated = false;

    private synchronized void populate() throws InvocationTargetException, IllegalAccessException {
        if(populated) return;

        BeanUtils.populate(target, properties);

        populated = true;
    }

    public Object getObject() throws Exception {
        populate();
        return target;
    }

    public Class getObjectType() {
        return target.getClass();
    }

    public boolean isSingleton() {
        return false;
    }
}

Bean.java

public class Bean {


    private String val1;

    public String getVal2() {
        return val2;
    }

    public void setVal2(String val2) {
        this.val2 = val2;
    }

    public String getVal1() {
        return val1;
    }

    public void setVal1(String val1) {
        this.val1 = val1;
    }

    private String val2;

}

test.xml

<bean id="bean" class="PropertySetFactoryBean">
    <property name="target">
        <bean class="Bean" >
        </bean>
    </property>
    <property name="properties">
        <props>
            <prop key="${key1}" >${val1}</prop>
        </props>
    </property>
</bean>


<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties">
        <map>
            <entry key="key1">
                <value>val2</value>
            </entry>
            <entry key="val1">
                <value>115551</value>
            </entry>
        </map>
    </property>
</bean>

テスト

    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("test.xml");
    Bean bean = (Bean) applicationContext.getBean("bean");
    System.out.println(bean.getVal1());
    System.out.println(bean.getVal2());

出力

null
115551
于 2013-11-06T07:00:16.360 に答える