一直不懂springmvc Java配置,现在好好理解一下这个,希望路过的朋友能够指出我的错误
这里可以看到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创建后就会注册一些
启动权限,安全、文件、角色
先这样吧,后面会搭建一下,验证一下自己的理论知识。