springmvc Java配置理解

本文解析了SpringMVC的Java配置方式,重点介绍了AbstractAnnotationConfigDispatcherServletInitializer类的作用及其实现过程,包括如何创建WebApplicationContext和DispatchServlet,并探讨了不同上下文之间的关系。
摘要由CSDN通过智能技术生成

一直不懂springmvc Java配置,现在好好理解一下这个,希望路过的朋友能够指出我的错误


一直搞不懂程序的具体过程:先看看最常用的springmvc的原理图:

这里可以看到dispatchServlet的重要性。

我通过前辈搭建好的springmvc java配置的断点调试找到这些类的运行顺序。

1、最先进来AbstractAnnotationConfigDispatcherServletInitializer类的protected Class<?>[] getRootConfigClasses()的方法。

可以看到这个方法是为了创建RootApplicationContext配置使用的,如果不需要创建就返回null.

看看是如何创建根应用上下文:

这里又有一个AnnotationConfigWebApplicationContext(基于注解配置的web应用上下文),有意思的是这个类能够通过注解来将配有@Component(这里是包含@Compotent的注解,如@Controller、@Service..)的类注册到WebApplicationContext中。这里强调一下,这个配置很重要,配置不好会出现注入失败的问题,很多小白(像我一样的),看到注入失败就头疼。

这里来个小插曲:上下文理解,这里感谢一位大神的文章:http://www.it165.net/pro/html/201502/33644.html

上图:

上下文的创建由全局上下文ServletContext开始,步骤:

1、tomcat服务器(可以是其他web服务器)在扫描webapp目录下的项目(可以设定其他目录)的项目,先找到web.xml文件,在Java配置应该是找到继承某个servletContext(这里是猜测)的类,如果有的话就直接创建ServletContext,再找到全局常量将全局常量以键值对的形式存放在ServletContext中,在ServletContext初始化的时候就可以获取到常量。

2、加载Listener监听器,org.springframwork.web.context.ContextLoadListener 这个监听是为了创建 pring的WebApplicationContext(IOC容器,用来存储bean实例)。(之前一直不知道加这个有什么用,反正加了就是正确的,现在才发现是用来ioc的)。

3、由上图可知,DispatchServlet是WebApplicationContext的子上下文。在web.xml加载顺序是:全局常量->监听器->过滤器->servlet.DispatchServlet是用来请求转发作用。这里我复制一点别人的东西:

四、spring配置时:<context:exclude-filter>的使用原因,为什么在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud这个controller

    既然知道了spring的启动流程,那么web容器初始化webApplicationContext时作为公共的上下文环境,只需要将service、dao等的配置信息在这里加载,而servlet自己的上下文环境信息不需要加载。故,在applicationContext.xml中将@Controller注释的组件排除在外,而在dispatcherServlet加载的配置文件中将@Controller注释的组件加载进来,方便dispatcherServlet进行控制和查找。故,配置如下:   applicationContext.mxl中:  <context:component-scan base-package='com.linkage.edumanage'>       <context:exclude-filter expression='org.springframework.stereotype.Controller'    type='annotation' />   </context:component-scan>   spring-mvc.xml中:   <context:component-scan base-package='com.brolanda.cloud'   use-default-filters='false'>        <context:include-filter expression='org.springframework.stereotype.Controller'    type='annotation' />   </context:component-scan>

我不明白,既然子上下文能用父上下文的信息,为什么还要在创建webapplicationContext时排除@Controller,需要在DispatchServlet中包含进来。猜测:大概是不想被DispatchServlet之外的Servlet看到@Controller.

现在回过头来,其实AnnotationConfigWebApplicationContext其实就是WebApplicationContext基于注解完成的。

AbstractAnnotationConfigDispatcherServletInitializer这个类不仅完成了WebApplicationContext的创建还创建了DispatchServlet.还有ServletContext,就是之前猜测最大的那个上下文。

这三个个方法,分别配置ServletContext、webApplicationContext和DispatchServlet的,当getServletConfigClasses返回null时,就共同使用WebApplicationContext的配置,因为这是父子上下文关系。

在DispatchServlet创建后就会注册一些


启动权限,安全、文件、角色

先这样吧,后面会搭建一下,验证一下自己的理论知识。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值