2010-04-14 26 views
0

我的想法是創建一個.jar文件,其中包含服務非管理由Spring Web的應用程序和jar文件與Spring提供

由Spring管理,應該由getBean()方法

我來了想把它放到WEB-INF的WEB-INF/lib中

然後在web-app Servlets中,我想使用Jar文件的功能。

1想法。創建封裝invokeation到Spring Context(getBean()等)的類 例如,我將使用的類將只獲取一個參數並返回一個參數 ,但在該類中將會調用Spring的getBean等

在這種情況下,我想通過jar導入來使用Servlet是沒有問題的。 只有東西,我應該在.jar裏面使用什麼樣的上下文來獲取bean,以便它在打包成jar之後起作用? ApplicationContext還是什麼?

2想法。有沒有另一種簡單的解決方案,如何打包成jar,然後在Spring環境中使用Services進行非託管?

回答

1

這樣做有很多可能性。要使用Spring,你並不需要所有東西都是Spring。

舉例來說,你可以在你web.xml配置Spring:

<web-app ...> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:com/acme/foo/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    ... 
</web-app> 

在你的servlet,你可以做WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("myBean")訪問豆。

根據環境的不同,還有其他的集成手段。例如,您可以在JSF中使用org.springframework.web.jsf.el.SpringBeanFacesELResolverHere是Spring管理的bean的JSF應用程序示例。

+0

@lexicore你的配置片段看起來很棒(如果有效的話)。我可以問你一些細節嗎?你看,在我看來,在這種情況下,我們應該把Spring管理的類放在WEB-INF/classes的某處。怎麼樣一個單獨的.jar文件。如果所有東西都打包成jar並放入WEB-INF/lib中,這個配置是否可以工作? – EugeneP 2010-04-14 10:41:09

+1

@EugeneP當然,它的工作原理,檢查我發佈鏈接的示例項目。如果classes和applicationContext.xml位於WEB-INF/classes中,或者位於WEB-INF/lib中,則無關緊要。它們將從類路徑中加載。我對此100%確信,這正是我們在許多項目中所做的。 – lexicore 2010-04-14 10:45:24

+0

我在beans.xml中使用「context:component-scan」,這可能是個問題。我編譯了一個jar文件,並將其放入WEB-INF/lib中,並按照您的建議編輯了web.xml。我不明白一件事:在哪裏放beans.xml?我應該將它保存在jar文件中還是放在WEB-INF目錄中?我嘗試了兩種方法,結果是一樣的:我可以獲取顯式存在於beans.xml中的bean,但無法獲取組件掃描工作(@Autowired)。錯誤是:「沒有名爲...的bean被定義」。有任何想法嗎? – EugeneP 2010-04-14 14:28:46

2

如果您在ApplicationContext上撥打電話getBean(),我不得不認爲您有點漏掉了這一點。春天發明了擺脫這個確切問題。 Spring依賴於依賴注入(控制反轉)的原理。這意味着您將服務注入到需要的地方,而不是按名稱請求它們,並且如果它們被命名,則命名是配置而不是代碼的一部分。

只要是類路徑的一部分,使用來自另一個jar的類是沒有問題的。他們只是像其他班級一樣加載。即使他們不在課程路徑中,如果需要,也可以使用ClassLoader來獲得它們。其中有點複雜的地方是類在另一個JVM中。即使是這樣,但聽起來並非如此。

你在說什麼這個參數?我強烈建議你考慮以RESTful類型的方式(在Spring 3 MVC中得到很好的支持)將命名服務綁定到某個上下文,而不是從手動加載的上下文實現某種註冊表或者明確的服務位置。

+0

@cletus你是對的,但是如果你將服務視爲一個整體塊,那麼你應該能夠從某個地方獲得它? getBean()是一種方法。 – EugeneP 2010-04-14 10:10:25

+0

@Eugene它是*一種方式去。這不是一個很好的方式去。這是Spring構建的隱藏你的實現細節。有充分的理由。 – cletus 2010-04-14 10:19:54

+0

我說的是這個參數。我的意思是,我構建了一個需要保存在數據庫中的對象,並將其傳遞給ServiceLayerWraper方法。看起來好像裏面沒有DAO,但實際上包裝類[SeviceLayerWraper]將getBean()從Spring獲取一個ServiceLayer對象,並通過鏈傳遞引用對象給它。然後,ServiceLayer將它保存在一個數據庫中(調用它的依賴,DAO)。 – EugeneP 2010-04-14 10:50:20

相關問題