contextConfigLocation中加载controller

问题描述

初学spring,遇到些问题希望大家帮忙看看吧~contextConfigLocation和DispatcherServlet的分工主要是什么?百度了下,感觉DispatcherServlet的加载的applicationContext主要在springmvc的使用,可以定义controller,contextConfigLocation里的controller是无法访问到的。但实际尝试了下,发下web.xml如下配置可以访问到contextConfigLocation加载beans-servlet.xml里的controller<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/project-servlet.xml,/WEB-INF/beans-servlet.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>project</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup></servlet>

解决方案

本帖最后由 zjdl1234 于 2015-01-03 02:08:47 编辑
解决方案二:
项目引入SpringMVC后,实际上已经存在两个Spring容器:Spring父容器:1、管理业务层bean2、Web容器启动时会触发ServletContextListener事件,从而启动了Spring父容器,从Spring容器启动顺序看,它是首先被启动的3、它会扫描指定包名下面所有标注的类,并装配到容器,@Controller配置的bean也不例外。4、Web层可以通过WebApplicationContextUtils.getWebApplicationContext(servletContext)取得Spring父容器5、父容器不能访问子容器的beanSpringMVC子容器:1、管理Web层bean2、DispatcherServlet是标准的Servlet,它设置了加载顺序为2,则未访问的情况下就会被Web容器实例化并执行init()初始化方法,方法中启动了SpringMVC子容器,因此从顺序上说,它是在父容器之后启动的。3、它会扫描指定包名下面所有标注的类,并装配到容器,@Service等等配置的bean也不例外。4、它的父亲是上面的父容器,这一点要注意。5、可以通过WebApplicationContextUtils.getWebApplicationContext(servletContext,"org.springframework.web.servlet.FrameworkServlet.CONTEXT."+DispatcherServlet的servlet名)取得6、子容器可以访问父容器的bean因此,两个容器重复扫描时,会在两个容器里出现相同类型但不同实例的Bean(形象地说就内存地址不一样),即Controller会在两个容器中实例化,但是父容器里的基本用不着(千万不要做从下而上逆向调用的设计),原因是从web容器进入来的请求首先会被DispatcherServlet捕捉到,而DispatcherServlet会交给SpringMVC容器处理,也就是说从子容器取出bean来处理,当子容器没有对应的bean时,则会从父容器找。最后说下这种情况下的最佳实践:假如某项目包名规划如下:org.howsun.domain;org.howsun.dao;org.howsun.service;org.howsun.web;Spring父容器可以扫描到“org.howsun”,但是要排除掉@Controllerbean:<context:component-scanbase-package="org.howsun"><context:exclude-filtertype="annotation"expression="org.springframework.stereotype.Controller"/></context:component-scan>

SpringMVC子容器应该只扫描到“org.howsun.web”<context:component-scanbase-package="org.howsun.web"/>

解决方案三:
问题还是不明白Controller是在beans-servlet.xml里定义的,子容器里都没有关联应该是不会创建实例的父容器里加载了文件,但按你的说法是不实例化Controller的?那表示也不会访问到这个Controller啊,现在是可以访问到如果修改了父容器的配置,beans-servlet.xml里的Controller就访问不到了<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/beans-servlet.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>project</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup></servlet>
解决方案四:
经测试,似乎并不存在两个隔离的容器,只是配置文件不同而已。多个配置文件生成的bean都在同一容器中。在同一配置文件中不允许出现id相同的bean。在不同的配置文件中可以出现id相同的bean。但是,只要这些bean是singlton,那么从任何地方引用,得到的都是同一实例。
解决方案五:
不解,applicationContext中的确无法取得dispatchServlet中的bean
解决方案六:
引用4楼skyhitnow的回复:

不解,applicationContext中的确无法取得dispatchServlet中的bean

还没理解?父容器不能访问子容器的bean,反之则可以。补充一个问题:那么Controller类在父容器装配后,而不在子容器装配,为什么web层访问不到呢?因为SpringMVC子容器从一个URI到Method执行,要经过一序列HandlerExecutionChain,这是Spring父容器不具备的,DispatchServlet请求SpringMVC子容器来处理。
解决方案七:
之前说的都理解了,Web层去获取业务层的实例肯定是没问题的~但按上面的说法,我现在碰到的问题是:我在业务层的配置文件beans-servlet.xml里定义了Controller,居然直接访问到。(前提条件是在业务层、Web层中同时定义配置文件project-servlet.xml)beans-servlet.xml里的配置很简单,就是定义了一个点do的bean去实例了自定义的Controller类。

时间: 2025-01-20 19:08:53

contextConfigLocation中加载controller的相关文章

AngularJs根据访问的页面动态加载Controller的解决方案

这篇文章主要介绍了AngularJs根据访问的页面动态加载Controller的解决方案,需要的朋友可以参考下 用Ng就是想做单页面应用(simple page application),就是希望站内所有的页面都是用Ng的Route,尽量不用location.href,但是这样的webapp好处是很多,但是美中不足的是当你的webapp随着时间的推移,用户变多,功能变得更丰富,controller也变得越来越多,你不得不把所有的controller当作全局模块进行加载,以使得在站内任何一个页面中

angularjs-angularJS动态加载controller

问题描述 angularJS动态加载controller 页面初始化时向后台发送ajax请求获得js文件路径进行加载 , 但是js文件中的controller无法调用显示XXX is not a function, 求一个能实现调用的方法 解决方案 贴代码看看,提示是XXXX不是一个函数 解决方案二: c++ 动态加载

ASP.NET MVC中加载WebForms用户控件(.ascx)

原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControls.Calendar),它会为"上一月"."下一月"的链接生成"__doPostBack()"的js调用,如下图: 目前发现它会带来两个问题: 1. 不支持IE10: 2. 某些电脑不允许执行__doPostBack. 问题提炼 前提: 我们想以最低

Tiger系列一:从XML中加载属性

xml|加载 JDK1.5(代号Tiger)中更新了java.util.Properties类,提供了从XML文件中读写key-value对属性的简单方法:loadFromXML()和storeToXML() 1.基本加载属性的方法 l Sample属性文件:sample.properties foo=barfu=bazl 加载属性的Sample程序 import java.io.FileInputStream;import java.util.Properties; public class

Flash中加载影片时,Loading的位置对影片的影响

loading|加载 在论坛经常看到Loading加载方式的探讨,不过大多都是讨论用何种加载方法及代码,今天我想对Flash中加载影片时,Loading的位置对影片的影响.Flash Loading有多种制作及加载方式,本文研究的重点是讨论主影片中加载外部swf文件时Loading的位置对影片的影响.也就是将Loading写在主影片内部还是被加载影片中.     首先从缓存进行考虑,由于浏览器可以缓存Flash文件,因此Loading放在主影片内部,或者被加载影片中都没有影响,浏览器第一次会自动

Flash动态文本框中加载HTML格式文本

动态|加载|文本框 在Flash中可以利用Actionscript可以在动态文本框中加载HTML格式的文本,这个教程就不给大家具体讲解HTML标记了,如果您不熟悉可以查看本站HTML基础知识栏目内容. 效果如下: 点击这里下载源文件(解压密码:www.webjx.com) 建立一个Flash文档,然后设置如下字体. 在上面图示中如果你没有设置多行.将文本呈现为HTML两项,那么我们可以使用下面代码: myText.html = true; myText.multiline = true; 然后设

Windows7中加载Virtual PC映像技巧

笔者在Windows7中使用了Virtual PC来生成Windows XP的虚拟机,在使用过程中一直非常稳定.不过 ,每次需要使用到虚拟机中的文件的时候却都要开启Virtual PC通过网络共享来获得,显得极其不方便和 占用系统资源. 那么,有没有更加简化的方法来轻松取得虚拟机中的文件呢?其实,Windows7已经为我们提供了一种快 捷方法.我们只需在计算机中加载虚拟机的VPC映像就可以达到目的了. 首先,我们点击"开始-所有程序-管理工具-计算机管理"命令打开"计算机管理

从资源中加载皮肤

由于单位上最近要开发一个内部使用的小型项目,我需要一个运行稳定的,能够将皮肤文件放到资源里的并且易于使用的界面开发包,当然,免费的最好.于是利用google一阵狂搜,嘿,真还找到了这样的一个开发库:AppFace For VC 0.2. AppFace For VC 支持Win9X/NT/2K/XP,UNICODE/ANSI,能够对目标进程里的所有Widows标准控件,系统菜单,通用对话框等实现换肤,对非商业用途而言,它是完全免费的.关键的是AppFace的使用非常简单,很容易添加到已有的工程中

Excel中加载宏动画教程

<Excel2003入门动画教程54.Excel中加载宏>. 演示动画 操作步骤 先将加载宏文档保存到相应的文件夹中,然后在Excel加载使用. 执行"工具加载宏"命令,打开"加载宏"对话框,点击"浏览"按钮,打开"浏览"对话框,选中需要加载的宏,依次确定返回. 注意:①如果是系统自身的加载,直接在"加载宏"窗口中选择相应的宏,确定即可.②如果你找不到加载宏文件夹,不能复制文件到其中,可以这样操