0

我在春天尝试过:

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 中获取道具!!!因为它是一个模块和其他Bean2value2

这是可以实现的吗?我觉得它非常基础!谢谢!!!

重要:对我来说重要的是我有一个包含子模块的 XML!通过这种方式,我很好地利用了 springs XML,在那里我定义了哪些 bean 作为子模块(对我来说也适用于其他事情)。他们当然也生活在相同的环境中!对我来说非常重要的是 bean 处于相同的上下文中。

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

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

4

2 回答 2

1

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

于 2012-08-01T06:39:07.930 回答
0

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

您可以在 Internet 上找到更多信息。

于 2012-08-01T07:08:32.983 回答