如何在Spring中为多个模块提供多个属性?

时间:2012-08-01 06:25:20

标签: java spring

我试着在春天跟随:

modules.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <import resource="classpath:module1.xml"></import>
    <import resource="classpath:module2.xml"></import>
</beans>

module1.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

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


    <bean id="bean1" class="Bean1">
        <property name="prop1" value="${key}"/>
    </bean>
</beans>

module2.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

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

    <bean id="bean2" class="Bean2">
        <property name="prop2" value="${key}"/>
    </bean>
</beans>

Bean1.java

import org.springframework.beans.factory.annotation.Autowired;

public class Bean1 {

    @Autowired
    public String prop1;

    public void setProp1(String val) {
        prop1 = val;
    }
}

bean2.java

import org.springframework.beans.factory.annotation.Autowired;

public class Bean2 {
    @Autowired
    public String prop2;

    public void setProp2(String val) {
        prop2 = val;
    }
}

ModulesBean.java

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ModulesBean {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
                new String[] {"modules.xml"});
        BeanFactory beanFactory = (BeanFactory) appContext;

        Bean1 bean1 = (Bean1) beanFactory.getBean("bean1");
        System.out.println("prop1: " + bean1.prop1);

        Bean2 bean2 = (Bean2) beanFactory.getBean("bean2");
        System.out.println("prop2: " + bean2.prop2);

    }
}

prop1.properties

key=value1

prop2.properties

key=value2

当我运行它时,结果如下:

prop1: value1
prop2: value1

但是我希望bean1的范围只能从道具文件1中获取道具!因为它是一个模块而其他Bean2需要value2 !!!

这可以实现吗?我发现它非常基本!感谢!!!

重要提示:对我来说,拥有包含子模块的XML非常重要!通过这种方式,我很好地利用了Spring,我在那里定义了哪些bean作为子模块(对我来说也适用于其他东西)。他们当然也在相同的环境中生活!对我来说非常重要的是豆子在相同的环境中。

重要:模块由其他开发人员编写,我无法控制他们使用的属性名称。

重要:父模块必须能够运行子模块bean,这意味着父/子在这里不好,子模块也不需要知道父属性,因为它们只是模块。

2 个答案:

答案 0 :(得分:1)

您应该为这两个键使用不同的名称。

答案 1 :(得分:0)

考虑使用Parent / Children Spring上下文层次结构。例如,您可以创建父上下文和两个子上下文,将属性文件加载到适当的文件中。在父类中加载的bean在所有子上下文之间共享,但子上下文有自己的bean范围。

您可以在互联网上找到更多信息。