2013-01-02 55 views
1

我有一些Spring託管類(通過xml配置),其中一個是SessionFactory,它被注入另一個Spring託管類。每當這個類需要一個新的Session時,它就調用SessionFactory上的createSession。Spring管理的非靜態工廠創建的bean

但是,除非我錯了,這意味着Sessions本身不是Spring管理的,這是有問題的,因爲它們有一些@Transactional方法,它們需要Spring來管理bean。

我一直在讀FactoryBeans,但我不知道如何做到這一點的最佳方式,特別是因爲我的createSession方法接受一個參數,而FactoryBean.getObject()沒有。

我可以使用getObject,然後手動設置參數更高,但我想強制在工廠設置,如果可能的話。

任何人都可以幫忙嗎?提前致謝。下面是一個簡化的例子。

public class SessionFactory { 

    public final Session createSession(String username){ 
     Session session = new SessionImpl(username); 
     return session; 
    } 

} 


public class SessionImpl implements Session{ 

    private String username; 

    @Override 
    @Transactional 
    public void doSomething(){ 
     // Does something 
    } 

    public void setUsername(String username){ 
     this.username = username; 
    } 

    public String getUsername(){ 
     return username; 
    } 

} 


public class Service { 

    private SessionFactory sessionFactory; // Set by Spring through xml config 

    public void doSomethingServicy(){ 

    } 

    public void setSessionFactory(SessionFactory sessionFactory){ 
     this.sessionFactory = sessionFactory; 
    } 


} 

回答

1

我解決它在春天創建工廠bean,並declaraing一個工廠bean和工廠方法prototype作用域的Session對象,如下圖所示:

<bean id="sessionFactory" class="com.SessionFactory" > 
     <property name="dependencyA" ref="dependencyA" /> 
     <property name="dependencyB" ref="dependencyB" /> 
</bean> 

<bean id=session" class="com.SessionImpl" factory-bean="sessionFactory" factory-method="createSession" scope="prototype" /> 

然後在代碼時獲取一個新的實例要求:

Session session = (Session) applicationContext.getBean(SpringConstants.SESSION_BEAN_NAME, username); 

這裏的用戶名是構成對獲得通過到工廠參數的Object...方法參數的一部分createSession方法

我很欣賞程序的結構可能會更好,但考慮到代碼的限制,它很好地解決了這個問題。

1

我會說你在錯誤的地方有@Transactional註解。

這不是會話,應該是事務性的;它應該應用於滿足您的用例的基於接口的服務方法。這是典型的春季成語。我建議遵循它。

+0

謝謝,但不幸的是,目前這不是一個選項,你能提出一個解決問題的辦法嗎? – TheBloodGuy

+0

我已經做了。這是一個選項。去吧。或者不要使用Spring事務。 – duffymo

+0

我的問題並不涉及@Transactional是否在正確的位置,但我是否可以從工廠獲得Spring管理的bean。我已經明確指出,移動註釋不是一種選擇,因爲這個問題涉及遺留代碼和限制,我無法改變它。 – TheBloodGuy