2012-07-12 27 views
1

我在獨立環境中使用Spring3.1。如何設置MDB編程和動態

我把話題JMS模板是這樣的:

<bean id="mm1sessionsTopicSendingTemplate" class="org.springframework.jndi.JndiObjectFactoryBean" 
    depends-on="jmsServerManagerImpl"> 
    <property name="jndiName"> 
     <value>/topic/mm1sessionsTopic</value> 
    </property> 
</bean> 

對於這個話題我這樣設置MDB與使用DefaultMessageListenerContainer:

<bean id="mm1sessionDispatcherListener" 
     class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <property name="pubSubDomain" value="true" /> 
     <property name="concurrentConsumers" value="1" /> 
     <property name="destination" ref="mm1sessionsTopicSendingTemplate" /> 
     <property name="messageListener" ref="mm1SessionMDB" /> 
     <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" /> 
    </bean> 

這樣,我必須在先進的通過XML設置mm1SessionMDB:

<bean id="mm1SessionMDB" class="com.mdb.SessionMDB"> 
     <property name="feedPropertiesDTO" ref="feedListenerMarketMaker1Properties" /> 

    </bean> 

但我需要我的應用程序來創建MDB實例編程式

我的意思是我想通過代碼來創建MDB的,因爲每個MDB都會有不同的驗證值,它將從主題檢索(通過feedPropertiesDTO)消息

基本上我將MDB與池相同的邏輯,但每一個都會有不同的屬性。 MDB'S的創建時間必須在運行時。

是可能的嗎?

謝謝, 射線。

回答

0

我認爲你可以使用工廠方法instantating您的MDB豆和使用方法

Object getBean(String name, Object... args) throws BeansException; 
的ApplicationContext

在代碼frogramatically實例豆。

因爲我知道這個方法允許你將參數傳遞給工廠方法。

在這裏什麼是在Java文檔此方法表示:

返回實例,其可以指定bean的是共享的或獨立的。

允許在 bean定義指定明確的構造器參數/工廠方法 參數,覆蓋指定的默認參數(如果有的話)。

我從來沒有使用過這種方法,但我認爲它適合您的情況。

編輯。

下面是一個演示我在說什麼的例子(這很簡單,但我沒有足夠的時間寫更復雜的)。

假設有接口和兩個它的實現:

public interface StringMakerInterface { 

    // Just return simple String depending on concrete implementation. 
    String returnDummyString(); 

} 

public class StringMakerImpl1 implements StringMakerInterface { 

    public String returnDummyString() { 
     return "test bean impl 1"; 
    } 


} 

public class StringMakerImpl2 implements StringMakerInterface{ 

    public String returnDummyString() { 
     return "test bean impl 2"; 
    } 

} 

而且我們有一個使用具體實現這個接口的一個類,這是我們應該dinamically注入conctrete實現:

public class StringPrinter { 

    private StringMakerInterface stringMaker; 

    public StringMakerInterface getStringMaker() { 
     return stringMaker; 
    } 

    public void setStringMaker(StringMakerInterface stringMaker) { 
     this.stringMaker = stringMaker; 
    } 

    public StringPrinter() { 

    } 

    // Just print dummy string, returned by implementation 
    public void printString() { 
     System.out.println(stringMaker.returnDummyString()); 
    } 
} 

這裏是我的示例的配置類:

@Configuration 
public class TestFactoryMethodConfig { 

    @Bean(name = "stringMaker1") 
    public StringMakerImpl1 stringMaker1() { 
     return new StringMakerImpl1(); 
    } 

    @Bean(name = "stringMaker2") 
    public StringMakerImpl2 stringMaker2() { 
     return new StringMakerImpl2(); 
    } 

    @Bean(name = "stringPrinter") 
    @Scope(value = "prototype") 
    public StringPrinter stringPrinter(@Qualifier("stringMaker1") StringMakerInterface stringMaker) { 
     StringPrinter instance = new StringPrinter(); 
     instance.setStringMaker(stringMaker); 

     return instance; 
    } 
} 

這裏是一個測試案例,演示在運行時注入dinamically:

@RunWith(value = SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes={TestFactoryMethodConfig.class}) 
public class TestFactoryMethod { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Resource(name = "stringMaker1") 
    private StringMakerInterface stringMaker1; 

    @Resource(name = "stringMaker2") 
    private StringMakerInterface stringMaker2; 

    @Test 
    public void testFactoryMethodUsage() { 

     StringPrinter stringPrinter1 = (StringPrinter) applicationContext.getBean("stringPrinter", stringMaker1); 

     StringPrinter stringPrinter2 = (StringPrinter) applicationContext.getBean("stringPrinter", stringMaker2); 

     stringPrinter1.printString(); 
     stringPrinter2.printString(); 
    } 

} 
+0

你能告訴我一個你的意思的例子嗎?使用工廠方法 – rayman 2012-07-12 09:09:21

+0

我添加了我曾經提出的方法。 – dimas 2012-07-12 10:08:52

+0

是的。但我讀到,使用這種技術只有在測試時纔是好的,不應該在生產方式中使用,因爲它可能導致內存泄漏等。 – rayman 2012-07-12 10:22:41