Spring - 使用 applicationContext.xml 和 XXXXX-servlet.xml

Posted

技术标签:

【中文标题】Spring - 使用 applicationContext.xml 和 XXXXX-servlet.xml【英文标题】:Spring - using applicationContext.xml and XXXXX-servlet.xml 【发布时间】:2011-03-30 13:02:48 【问题描述】:

我正在将 Spring MVC 集成到我一直在从事的现有项目中。通过集成,我的意思是我正在使用 Spring 重写项目,并使用我的大部分旧代码。我已经设置了环境并开始着手处理它。我将此项目称为 ProjectX

我已经设置并配置了我的 ProjectX-servlet.xml,它包含视图解析器 bean 和控制器 bean 等。我想设置一个 applicationContext.xml 文件,我可以将我的所有 DAO bean 放在...

<bean id="MemberDAO" class="com.xxx.xxx.MemberDAO"/>
<bean id="ProductDAO" class="com.xxx.xxx.ProductDAO"/>

我希望这些值位于 applicationContext.xml 中,以便在我的控制器中执行以下操作。

public SomeController extends SimpleFormController

   private MemberDAO memberDao;
   private ProductDAO productDao;

   ...getter/setter methods for memberDao;

   ...getter/setter methods for productDao;

并且值将可用(将它们注入控制器)

我已经在 ProjectX-servlet.xml 中配置了控制器,如下定义。

<bean name="/SomeController.thm" class="com.xxx.xxx.controllers.SomeController">
      <property name="memberDao" ref="MemberDAO"/>
      <property name="productDao" ref="ProductDAO"/> 
</bean>

我认为我需要在我的 web.xml 中配置如下内容,以便它知道加载应用程序上下文。

  <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>

  <servlet>
   <servlet-name>context</servlet-name>
   <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>

我的问题是,在创建 applicationContext.xml 文件后我必须做什么,才能执行上面显示的操作并注入诸如 ProductDAOMemberDAO 到我在 ProjectX-servlet.xml

中配置的控制器中

我已经使用 Spring MVC 签订合同几个月了,并且对如何使用它感到满意,但我是新来自己配置它,供我自己使用,所以如果有任何建议或答案,我将不胜感激对我来说更容易解释。

谢谢

【问题讨论】:

【参考方案1】:

按照惯例,您为DispatcherServlet 的实例指定的名称将与name-servlet.xml 相关联。如您所述,此上下文将是applicationContext.xml 的子级,这意味着它将可以访问applicationContext.xml 中的bean。

在您的 web.xml 中尝试以下操作:

<servlet>
        <servlet-name>ProjectX</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
        <servlet-name>ProjectX</servlet-name>
        <url-pattern>/projectx/*</url-pattern>
</servlet-mapping>

【讨论】:

【参考方案2】:

您不必做任何特别的事情。您可以继续将 applicationcontext.xml 中定义的 bean 注入 xx-servlet.xml 中定义的 bean,就好像它们都在同一个文件中声明一样。请记住使用属性 ref 而不是 ref-local,如下所示。

<bean id="mycontroller" class="x.y.z.CustomerController>
   <property name="service" ref="myservice"/><!--myservice defined in applicationcontext-->
</bean>

【讨论】:

【参考方案3】:

除非我有误解,否则您正在寻找的解决方案是在 applicationContext.xml 中使用导入语句。这有效地将两个 XML 文件组合到一个上下文中,允许您在其中一个中引用 bean。

例如:

<import resource="classpath:foo/bar/ProjectX-servlet.xml" />

您可能想也可能不想使用“类路径”。详情请见section 3.2.2.1 in the Spring docs。

【讨论】:

以上是关于Spring - 使用 applicationContext.xml 和 XXXXX-servlet.xml的主要内容,如果未能解决你的问题,请参考以下文章

Spring事件发布

Spring事件发布

Spring事件发布

Spring基本功能详解

Spring基本功能-IOC

[Spring Boot] Singleton and Prototype