2011-09-30 66 views
1

我有兩個maven項目,說MvnSpring和MvnGuice.MvnSpring正在研究春季和冬眠框架的作品。 MvnGuice正在研究谷歌guice和mybatis。我需要將這兩個功能結合在一起。 兩者都遵循單例模式。編碼時我需要在MvnGuice中獲得一些MvnSpring。爲此,我創建了一個MvnSpring的jar,並將其放入.m2存儲庫,並在MvnGuice中提供依賴關係詳細信息。現在我可以在MvnGuice類中導入MvnSpring類.MvnSpring使用spring依賴注入,MvnGuice使用guice依賴注入來創建對象。現在在MvnSpring流程中是MSserviceImpl(實現MSservice)> MSdaoImpl(實現MSdao)。現在我需要從MvnGuice中調用MSService類。然後在運行時顯示錯誤,如MSService類爲null。然後我在MvnGuice中爲MSService類做了一個guice依賴注入。現在控件到達MSserviceImpl,但現在MSdao在這裏爲null。是否有可能與MvnGuice一起啓動MvnSpring。我希望我能解決這個問題。在兩個框架上結合兩個基於maven的項目

回答

2

雖然Spring和Guice針對同一個問題IoC,但他們採用完全不同的方法來解決它。它們在功能和配置方式上有所不同,Spring有bean定義,Guice使用綁定​​。

幸運的是,它們有共同的理由,它們都支持JSR-330這一定義了一組註釋的標準規範。這使您能夠編寫單例並描述他們需要的注入,而不依賴於Spring或Guice。

這樣,無論您在特定項目中使用的框架如何,您都可以在項目之間共享您的單身人士。我不會推薦在同一個項目中同時使用Guice和Spring,除非它們之間有明確的分隔。例如,你可以使用Guice作爲Spring代碼通過定義的API使用的模塊,它隱藏了它在內部基於Guice的事實。

1

已經提到過JSR-330。 對於某些情況下,它可能是不夠的,比如,你有代碼:

final String className = config.getProperty(«serviceImpl»); 
// Class.forName(name) and check required interface for type safety 
final Class<? extends Service> serviceClass = Reflection.classForName(className, Service.class); 
final Service service = injector.getInstance(serviceClass); 

在不同的DI環境中,您都應該支持com.guice.inject.Injector.getInstance()和org.springframework.context .ApplicationContext.getBean()實現。

有草案解決方案sdif4j簡單的依賴注入門面。 這個項目的想法是封裝不同的DI框架邏輯與自己的抽象,以擴展默認的JSR-330的可能性。請注意,目前還沒有公開發布,但您可以找到如何解決問題或在分支中進行內部發布的想法。 一般問題是,你的MvnSpring和MvnGuice項目都應該基於JSR-330(而不是guice/spring註釋)和org.sdif4j:sdif4j-api(或者你自己的抽象;只有需要注入器功能)。建議使guice和spring依賴可選(編譯但不導出)以允許庫客戶端自己選擇DI。 在您的MvnCompineGuiceAndSpring中,您只需聲明sdif4j-guice或sdif4j-spring依賴項(它類似於slf4j的用法)並配置您的DI環境。您可以在測試子項目中找到不同的示例。

更多注意事項: Spring的默認範圍是singleton,Guice - prototype(Spring術語)。所以,如果你想有一個原型的bean,你可以使用:

@org.springframework.context.annotation.Scope("prototype") 
@javax.inject.Named 
public class TestPrototype { 
} 

Spring的@Scope註解應該由吉斯即使彈簧不會出現在你的classpath被忽略。 還必須聲明你的所有辛格爾頓豆@ javax.inject.Named和@ javax.inject.Singleton註解支持Spring和吉斯,像這樣:

@javax.inject.Named 
@javax.inject.Singleton 
public class TestSingleton implements ITestSingleton { 
    public TestSingleton() { 
    } 
} 

與@Scope註解,你可以在你的代碼中使用@ImplementedBy(@ProvidedBy)guice註釋(在可行的情況下;小心使用它,通常這不是一個好習慣),這在Spring DI中也應該被忽略(在這兩種情況下,如果Spring存在於classpath中)。

希望,很明顯。