spring 和 springmvc 容器关系父子关系图
ContextLoaderListener 初始化的上下文和 DispatcherServlet初始化的上下文关系如下:
ContextLoaderListener 初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;
DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。
访问规则:子容器可以访问父容器的对象,父容器不可以访问子容器的对象。
如果子容器加载了service 、dao ,则controller调用service的时候,会调用子容器中的service,但是service 的事务事务是在父容器中设置得,所以会导致事务失效。子容器和父容器的功能时一样的。
为什么要有两个容器??
DispatcherServlet表现层框架,而spring和其他框架也可以整合,Spring扩展性比较好;
<code>xml中通过配置<component-scan> ;
<component-scan>提供了2个子标签
<include-filter>
<exclude-filter>
<component-scan>如果只想扫描controller,/<component-scan>/<exclude-filter>/<include-filter>/<component-scan>/<code>
如果只想扫描controller
<code><component-scan>
<include-filter>
/<component-scan> /<code>
use-default-filter="true":对base-package 包或者子包下的所有@component 或者子类@Service @Reposity 等注册为bean
如果是下面:
<code><component-scan>
<include-filter>
/<component-scan> /<code>
上面的代码会扫描Controller 、service等下面类或者子类。
出现上面的问题时因为 <include-filter>没有起作用,如果要起作用只需把:use-default-filter=false;/<include-filter>
所以如果想要 <include-filter> <exclude-filter> 这两个起作用,use-default-filter必须设为false./<exclude-filter>/<include-filter>
閱讀更多 碼農的一天 的文章