2012-08-27 28 views
0

我是一個相對較新的Spring用戶,我有興趣使用此框架來加載複雜的嵌套配置。Spring,在運行時擴展的內部Bean集合

以下是我的架構設計的僞代碼:

class **A** implements runnable{ 
     int x; 
     Collection<**B**> clist;   //not fixed size list, 
     run(){ 
      // if (something happens) 
      //   new Thread(**B**(y,z,w)) 
     } 
    } 

    class **B** implements runnable{ 
     int y; 
     int z; 
     int w; 
     Array<**C**> bclist;   // fixed size array of C known at init time 
     run(){ 
      process... 
     } 
    } 

    class **C**{ 
     int v; 
     int l; 
    } 

我需要能夠配置斧,通過,BZ,BW,B.clist,CV和Cl

我有一個與每個新線程的B初始化相關的單個問題,我不知道在編譯時clist是否將保持爲空,並且只有在運行時我纔會知道將創建多少個線程。對於每個新線程,我都會使用相同的配置創建新的B.

(我看着自動裝配和原型的特點,我懷疑它在某種程度上可以幫助)

編輯

在這裏,我有XML示例文件:

  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
      <beans> 
       <bean id="A" class="..."> 
        <property name="x" value="150" /> 
        <!-- HERE IS MY PROBLEM--> 

        <property name="clist"> 
         <list> 
          <ref bean="B" /> 
         </list> 
       </bean> 

       <bean id="B" class="..."> 
        <property name="y" value="20" /> 
        <property name="z" value="7" /> 
        <property name="w" value="7" /> 
        <property name="bclist"> 
         <list> 
          <ref bean="C" /> 
         </list> 
       </bean> 

       <bean id="C" class="..."> 
        <property name="v" value="3" /> 
        <property name="l" value="1" /> 
       </bean> 
      </beans> 

回答

0

我有可能解決這個問題,它可能不是最佳的。

在XML i可以註釋掉CLIST的設置(沒有其包括在結構中的全部)的一個bean

,當我在Java代碼創建乙豆,i可以使用的getBean (「B」),同時將xml中的B bean定義爲原型。

像這樣:

  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
      <beans> 
       <bean id="A" class="..."> 
        <property name="x" value="150" /> 
       </bean> 

       <bean id="B" class="..." scope="prototype"> 
        <property name="y" value="20" /> 
        <property name="z" value="7" /> 
        <property name="w" value="7" /> 
        <property name="bclist"> 
         <list> 
          <ref bean="C" /> 
         </list> 
       </bean> 

       <bean id="C" class="..."> 
        <property name="v" value="3" /> 
        <property name="l" value="1" /> 
       </bean> 
      </beans> 

Java代碼:

class **A** implements runnable{ 
    int x; 
    Collection<**B**> clist;   //not fixed size list, 
    run(){ 
     // if (something happens) 
     //   new Thread((B)context.getBean("B")) 
    } 
    }