据我了解,Spring MVC应用程序有两个不同的上下文,即应用程序上下文和Web上下文,它们分别由applicationContext.xml和dispatcher-servlet.xml控制。
在我的控制器中,如何将bean加载到这两种上下文中?
请注意,我知道Getting Spring Application Context。这将回答我关于独立应用程序的问题。我将使用工厂从xml文件加载应用程序上下文,但这似乎是在Spring MVC中加载bean的错误方法。
答案 0 :(得分:4)
虽然Spring MVC应用程序有两个不同的上下文,但Web上下文可以访问应用程序上下文中加载的所有bean。但是,应用程序上下文无法访问Web上下文中的bean。这用于强制分离关注点,例如业务规则类不需要了解HTTP会话。因此,如果您有一个bean,则需要从两个上下文访问它,它必须在应用程序上下文中声明。
答案 1 :(得分:4)
Matt绝对正确。你不应该在你的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
。这是分离不同层(表示,服务和数据层)的一种非常好的做法。
答案 2 :(得分:1)
您的Controller具有的任何依赖项(例如服务层类,DAO等)都应该表示为正常 - 通过注入,构造函数注入或setter注入。
控制器映射的上下文只是将其与正常情况下所需的任何依赖关系连接起来。 Controller代码永远不需要直接使用Spring来获取任何bean,它与它们连接起来。
答案 3 :(得分:1)
您应该使用依赖注入和配置文件将bean加载到控制器中,但如果您确实需要直接访问应用程序上下文,那么任何扩展AbstractController(或其任何后代)的Controller都可以访问{{1方法。
答案 4 :(得分:1)
在独立应用程序中,我们可以使用context.Refresh()它将重新加载/重新实例化新请求的bean,旧bean只有旧实例。
在Web应用程序中,我们需要覆盖ContextLoaderListener并调用contextInitialized()
答案 5 :(得分:1)
您需要将包含服务层的bean定义(例如,service-context.xml)的文件导入到新项目中。可以这样做:
<import resource="classpath:service-context.xml"/>