spring容器(ContextLoaderListener产生的)和springmvc容器(dispatcherServlet产生的)区别和理解

父子容器,他们都是WebApplicationContext。

有时候bean在springmvc里面产生,有时候在spring容器里面产生,两者都可以扫描注解,配置事务。

我们完全可以只用springmvc容器,而不使用spring容器来做应用,一点问题都没有。但是这样,整个应用就和springmvc耦合了,有可能将来我们面对的web层,前端层是多重的 比如,移动端,PC,REST接口,暴露服务什么的,我们想要定义多个DispacherServlet,springmvc组件,但是如果我们只是用的springmvc来做的应用,里面还包含了业务,那实在不好处理,变得非常复杂。但是如果我们是把业务那部分用的spring容器来处理,web层用的是springmvc来处理,此时我们定义了多个DispacherServlet,springmvc组件,但是我们的业务只有一份,这也是分离开的。而且web层的mvc框架,也有可能是其他的,,比如struts,并不只是springmvc,所以说父子容器分离,是一种很好的去耦合的设计。

我们将web层(Controller)的组件放在springmvc容器中,将其他的application组件放在spring根容器。我们知道Controller是不负责业务的,而负责业务的是Service所以一般都是在spring中配置事务,在springmvc中不配置事务。如果springmvc容器和spring容器都对service层的组件进行了扫描,那么会在两个容器里面都部署了Service对象,其中spring部署的那个对象,如果这个对象有事务注解,那么这个对象是被是事务aop代理后的对象,但是springmvc部署的那个对象,因为springmvc没有配置事务,所以这个对象是没有被事务代理过的,即使有注解,但是没啥用。service层的对象一般来说都是注入到Controller的,Controller是springmvc管理的,现在父子容器都有符合要求可以注入的service对象,但是注入的时候,是有亲疏优先级的,所以会优先注入那个没有被事务aop代理过的springmvc中部署的对象,所以我们会发现事务失效了。

猜你喜欢

转载自blog.csdn.net/blossomfzq/article/details/80653011