2012-08-01 56 views
0

我試圖在以下彈簧:如何在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對我很重要!通過這種方式,我利用彈簧很好的XML,在那裏我定義了哪些bean作爲子模塊(對我來說也是有用的)。當然,他們也生活在相同的環境中!對我來說非常重要的是,豆類在相同的環境中。

重要:模塊是由其他開發人員編寫的,我無法控制他們使用哪些屬性名稱。

重要:父模塊必須能夠運行子模塊bean,這意味着父/子在這裏不好,子模塊也不需要知道父屬性,因爲它們只是模塊。

回答

0

考慮使用父/子彈簧上下文層次結構。例如,您可以創建一個父上下文和兩個子上下文,以合適的方式加載您的屬性文件。加載在父級上的bean在所有子級上下文之間共享,但上下文有自己的bean範圍。

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

+0

但是如果我讓別人開發一個模塊(比如一個插件),並且他使用了一些偶然在父類中定義的「key」,那麼他的模塊會收到它嗎?我希望這些模塊能夠分別定義模塊創建者彼此之間以及包含者之間不相互通信的屬性,因此碰撞可能會發生,我不希望模塊從其他模塊或父類獲取屬性。 – Jas 2012-08-01 10:16:43

+0

另外我不能使用父/子上下文,因爲我需要我的父上下文來注意子上下文中的bean,因爲它使用它們,它將遍歷子上下文中的每個bean(如果我們使用子上下文) - 將使用每個模塊中的每個bean並依次運行它們。 – Jas 2012-08-01 10:23:47

1

您應該爲這兩個鍵使用不同的名稱。

+0

我無法控制它,我打算由其他人開發的模塊,我喜歡它是可插入的,我不想強​​制開發人員使用不同的名稱,他們不知道每個名稱。 – Jas 2012-08-01 09:17:23

+0

恐怕我不能說在春天是否支持你要找的東西,不管遲早有人會看一眼全局,如果有幾個屬性會讓人困惑,同名,但含義不同。我建議,無論您是否設法解決封裝問題,都要爲每個模塊分配一個前綴,從而使這些密鑰具有全局唯一性。像module1.key和module2.key。 – Buhb 2012-08-01 12:45:39

相關問題