spring容器和springmvc容器

关系

springmvc容器是spring容器的子容器,但是子容器可以父容器的bean, 但是父容器不能访问子容器的bean

可以把所有的bean都配置在springmvc容器的配置文件中,但是拓展性不好。所有一般都各司其职,因此包扫描要分开。


初始化


<web-app>
    <display-name>Archetype Created Web Applicationdisplay-name>
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring/applicationContext.xmlparam-value>
    context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    <servlet>
        <servlet-name>dispatcherservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc/dispatcher-servlet.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>

        <servlet-name>dispatcherservlet-name>
        <url-pattern>/url-pattern> 
    servlet-mapping>
web-app>

1.web.xml先初始化通用上下文 ContextLoaderListener
对应的是spring的WebApplicationConetext
2.然后是dispatch-servlet这个web mvc上下文


管理范围

一般来说spring容器不管理controller层,因为那些什么@RequestMapper…都是spring子项目Springmvc实现的,所以controller层和那些视图bean啥的都归springmvc容器管理, 而数据库的管理(数据连接池和mybatis啥的)以及service、dao层等归spring这父容器管理


综上

  1. springmvc容器管理: controller层以及各种视图、映射…解析适配器
  2. spring容器管理:dataSource、service、dao等

注意

如果两个容器不各司其职,比如两个配置文件的包扫描都如下


<context:component-scan base-package="项目.*"/>

那么做为子容器的springmvc容器就一手遮天了, 最终扫描到的注解bean都会注入到springmvc容器,而不是spring容器,spring容器没有这些bean。 而且作为父类的spring容器无法访问springmvc容器的bean。

!!! 易出现的坏情况
如果配置的事务驱动bean放在了spring配置文件applicationContext.xml


<tx:annotation-driven transaction-manager="transactionManager"/>

这时业务类里面的@Transactional是被springmvc容器捕获扫描到的(spring容器不能),但是springmvc容器里没有这个驱动配置,显然这个注解就废了。

你可能感兴趣的:(SSM,框架开发,Spring,Spring,MVC)