簡體   English   中英

如何將bean加載到Spring MVC的應用程序上下文中?

[英]How do you load a bean into Spring MVC's application context?

據我了解,Spring MVC應用程序有兩個不同的上下文,即應用程序上下文和Web上下文,它們分別由applicationContext.xml和dispatcher-servlet.xml控制。

在我的控制器中, 如何將bean加載到這些上下文中的任何一個?

請注意,我知道獲取Spring應用程序上下文 這將回答我關於獨立應用程序的問題。 我將使用工廠從xml文件加載應用程序上下文,但這似乎是在Spring MVC中加載bean的錯誤方法。

雖然Spring MVC應用程序有兩個不同的上下文,但Web上下文可以訪問應用程序上下文中加載的所有bean。 但是,應用程序上下文無法訪問Web上下文中的bean。 這用於強制關注點分離,例如業務規則類不需要了解HTTP會話。 因此,如果您有一個bean,您需要從兩個上下文訪問它,它必須在應用程序上下文中聲明。

馬特是絕對正確的。 你不應該在你的MVC應用程序中使用任何類型的bean加載/實例化代碼,否則你做錯了什么。 您可以在相應的spring XML配置文件中定義bean。

<bean id="pinboardServiceTarget" class="com.lifepin.services.PinboardService">
    <property name="pinboardEntryDao" ref="pinboardEntryDAO"/>
</bean>
...
<bean id="pinboardEntryDAO" class="com.lifepin.daos.PinboardEntryDAO">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

你的PinboardService類(這只是我最近寫的一個應用程序)將有一個屬性IPinboardEntryDAO類的

public class PinboardService implements IPinboardService{
  private IPinboardEntryDAO pinboardEntryDao;

  ...

  public void setPinboardEntryDAO(IPinboardEntryDAO dao){
     this.pinboardEntryDao = dao;
  }

  public IPinboardEntryDAO getPinboardEntryDAO(){
    ...
  }

  ...
}

public class PinboardEntryDAO implements IPinboardEntryDAO{
   ...
}

請注意,在PinboardService類中,我使用的是DAO接口,而不是實現本身,而在配置中,我將注入實際的PinboardEntryDAO實現。 這是分離不同層(表示,服務和數據層)的一種非常好的做法。

控制器具有的任何依賴關系(例如服務層類,DAO等)都應該表示為正常 - 通過注入,構造函數注入或setter注入。

映射控制器的上下文只是將其與正常情況下所需的任何依賴關系連接起來。 Controller代碼永遠不需要直接使用Spring來獲取任何bean,它與它們連接起來。

您應該使用依賴注入和配置文件將bean加載到控制器中,但如果您確實需要直接訪問應用程序上下文,則任何擴展AbstractController(或其任何后代)的Controller都可以訪問getApplicationContext()方法。

在獨立應用程序中,我們可以使用context.Refresh()它將重新加載/重新實例化新請求的bean,舊bean將僅具有舊實例。

在Web應用程序中,我們需要覆蓋ContextLoaderListener並調用contextInitialized()

您需要將包含服務層的bean定義(例如,service-context.xml)的文件導入到新項目中。 可以這樣做:

<import  resource="classpath:service-context.xml"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM