2012-11-20 53 views
0

在Spring MVC中從Controller訪問服務層的最佳方法是什麼?我正在使用SpringMVC的註釋。來自Spring MVC控制器的訪問服務層

早些時候,我曾經每次從bean工廠獲取bean,方法是在每個控制器的方法中調用ClassPathXMLApplicationContext(spring-bean-name.xml)。

從問題Accessing Service Layer from custom Controller in Spring MVC的解決方案我明白,服務bean必須是自動裝配的。

但是假設控制器訪問多個服務,我們是否需要注入多個bean?但是這不是一個好的做法,因爲我們將不得不在一個控制器中僅使用1-2個方法中的特定服務,並且不好使它成爲類變量而不是函數變量。

回答

3

你是對的,你需要自動連接你打算使用的服務。不要擔心類變量與本地(函數)變量,這是如何實現DI模式。

在最嚴格的OO設計意義上,您有一點不應該在類級別聲明變量,除非它們涉及描述對象的狀態。然而,DI(依賴注入)是一種非常成熟的模式,沒有開發人員會將服務bean視爲自動裝配的類成員,而不管實際使用該服務的方法有多少。

關於一個側面說明,在每個方法中做new ClassPathXMLApplicationContext("spring-bean-name.xml")絕對是100%錯誤的方法來做到這一點。這涉及到每次執行該方法時創建一個新的bean-factory和bean-context ,這是一個很大的開銷並且完全沒有必要。應該創建豆工廠一次(如果您在使用DispatcherServlet或ContextLoaderListener的servlet引擎環境中)。

+0

謝謝。你是否可以給出一個示例代碼或鏈接來演示最後一部分:「bean工廠應該創建一次(如果你處於servlet引擎環境中,使用DispatcherServlet或ContextLoaderListener)」。當我使用多個控制器並構建一個非常大的應用程序時,我該如何做到這一點。 –

+1

@AkhilKNambiar http://www.dzone.com/tutorials/java/spring/spring-annotation-controller-1.html – user533

+1

你看過[官方文檔](http://static.springsource.org/spring /docs/3.1.x/spring-framework-reference/html/)?特別是第16章(某種程度上18.2)應該對你很有意思。我建議你去研究它,以更好地理解Spring和DI的工作原理。 – pap

0

你可以有哪些實例bean工廠靜態類,然後用這個靜態類

static class SpringConfig() 
{ 
    private static ApplicationContext ctx = null; 
    static 
    { 
     ctx=new ClassPathXmlApplicationContext("context.xml"); 
    } 

    public static Object getBean(String beanName) 
    { 
     return ctx.getBean(beanName); 
    } 
} 
0

這就是爲什麼你必須設法讓所有使用相同的依賴在一起的方法的自定義靜態的getBean方法,這是低耦合。不好的做法是不把你的依賴注入爲全局變量。糟糕的做法是不要將您的方法分組,以使您的班級不再耦合。