spring—springmvc整合

1.在WEB应用中使用Spring
   1.创建IOC容器对象
   2.Web应用工作阶段:初始化阶段-->请求响应阶段--->卸载前清理
   3.Web应用初始化阶段【只创建一次】将IOC容器对象创建出来,并保存到application域中【让在同一个web应用下的都能访问同一个IOC容器】
       
       pageContext
       request
       session
       application/servletContext
       
   4.web应用创建IOC容器
     1.在web.xml文件中配置Spring提供的一个监听器创建IOC容器对象
        org.springframework.web.context.ContextLoaderListener
     2.配置Web应用的初始化参数告诉Spring,配置文件的位置
     3.需要导入Spring在web应用中专用的jar包
       spring-web-4.0.0.RELEASE.jar
       spring-webmvc-4.0.0.RELEASE.jar       

 1      <!-- 配置加载Spring IOC容器的监听器 -->
 2         <context-param>
 3             <param-name>contextConfigLocation</param-name>
 4             <param-value>classpath:applicationContext.xml</param-value>
 5         </context-param>
 6 
 7         <!-- Bootstraps the root web application context before servlet initialization -->
 8         <listener>
 9             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
10         </listener>     

  
7.Spring整合SpringMVC!
   实际上SpringMVC就运行在Spring环境之下,还有必要整合么?
   SpringMVC和Spring都有IOC容器,是不是都需要保留呢?
 
  答案是:通常情况下,类似于数据源,事务,整合其他框架都是放在spring的配置
          文件中(而不是放在SpringMVC的配置文件中),实际上放入Spring配置文件对
          应的IOC容器中的还有Service和Dao.而SpringMVC也搞自己的一个IOC容器,在
          SpringMVC的容器中只配置自己的Handler信息。
          
    1.导入Spring和SpringMVC的所有jar包
        c3p0-0.9.1.2.jar
        com.springsource.net.sf.cglib-2.2.0.jar
        com.springsource.org.aopalliance-1.0.0.jar
        com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
        commons-logging-1.1.3.jar
        mysql-connector-java-5.1.37-bin.jar
        spring-aop-4.0.0.RELEASE.jar
        spring-aspects-4.0.0.RELEASE.jar
        spring-beans-4.0.0.RELEASE.jar
        spring-context-4.0.0.RELEASE.jar
        spring-core-4.0.0.RELEASE.jar
        spring-expression-4.0.0.RELEASE.jar
        spring-jdbc-4.0.0.RELEASE.jar
        spring-orm-4.0.0.RELEASE.jar
        spring-tx-4.0.0.RELEASE.jar
        spring-web-4.0.0.RELEASE.jar
        spring-webmvc-4.0.0.RELEASE.jar
        
     2.在web.xml文件中分别配置SpringMVC和Spring的配置信息
               

 1     <!--spring配置-->
 2 <context-param>
 3                     <param-name>contextConfigLocation</param-name>
 4                     <param-value>classpath:applicationContext.xml</param-value>
 5                 </context-param>
 6 
 7                 <listener>
 8                     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 9                 </listener>
10  <!--springmvc配置-->               
11 <servlet>
12                     <servlet-name>springDispatcherServlet</servlet-name>
13                     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
14                     <init-param>
15                         <param-name>contextConfigLocation</param-name>
16                         <param-value>classpath:springmvc.xml</param-value>
17                     </init-param>
18                     <load-on-startup>1</load-on-startup>
19                 </servlet>
20 
21                 <servlet-mapping>
22                     <servlet-name>springDispatcherServlet</servlet-name>
23                     <url-pattern>/</url-pattern>
24                 </servlet-mapping>
25                 <!--POST请求的乱码处理-->
26                 <filter>
27                     <filter-name>CharacterEncodingFilter</filter-name>
28                     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
29                     <init-param>
30                         <param-name>encoding</param-name>
31                         <param-value>utf-8</param-value>
32                     </init-param>
33                 </filter>
34                 <!--POST请求转化为PUT请求和DELETE请求-->
35                 <filter-mapping>
36                     <filter-name>CharacterEncodingFilter</filter-name>
37                     <url-pattern>/*</url-pattern>
38                 </filter-mapping>
39                 
40                 <filter>
41                     <filter-name>HiddenHttpMethodFilter</filter-name>
42                     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
43                 </filter>
44                 <filter-mapping>
45                     <filter-name>HiddenHttpMethodFilter</filter-name>
46                     <url-pattern>/*</url-pattern>
47                 </filter-mapping>

         
       3.配置spring的配置文件和springmvc的配置文件
             spring的配置文件:               

 1             <!-- 配置扫描的包 -->
 2                     <context:component-scan base-package="com.neuedu"></context:component-scan>
 3                     <!-- 加载properties文件中 信息 -->
 4                     <context:property-placeholder location="classpath:jdbc.properties"/>
 5                     <!-- 配置数据源 -->
 6                     <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
 7                         <property name="user" value="${jdbc.user}"></property>
 8                         <property name="password" value="${jdbc.passowrd}"></property>
 9                         <property name="jdbcUrl" value="${jdbc.url}"></property>
10                         <property name="driverClass" value="${jdbc.driver}"></property>
11                     </bean>
12                     
13                     <!-- 配置JdbcTemplate对应的bean, 并装配dataSource数据源属性-->
14                     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
15                         <property name="dataSource" ref="comboPooledDataSource"></property>
16                     </bean>
17                     <!-- 为了执行带有具名参数的SQL语句,需要配置NamedParameterJdbcTemplate -->
18                     <!-- 该NamedParameterJdbcTemplate类没有无参构造器,需要传入JdbcTemplate对象或者数据源对象[DataSource] -->
19                     <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
20                         <!-- 不能使用property标签配置哦 -->
21                         <constructor-arg ref="jdbcTemplate"></constructor-arg>
22                     </bean>                   

            springmvc的配置文件:                            

1        <context:component-scan base-package="com.neuedu"></context:component-scan>
2                 
3                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
4                     <property name="prefix" value="/WEB-INF/views/"></property>
5                     <property name="suffix" value=".jsp"></property>
6                 </bean>
7                 <mvc:default-servlet-handler/>
8                 <mvc:annotation-driven></mvc:annotation-driven>         

        加入jdbc.properties文件         

        jdbc.user=root
            jdbc.passowrd=123456
            jdbc.url=jdbc:mysql://localhost:3306/jdbc_template
            jdbc.driver=com.mysql.jdbc.Driver

          
      4.创建Controller类与Service类,并创建这两个类的无参构造器,分别输出一句话!
      
      5.启动项目,会发现controller构造器和service构造器都执行了两次!
        问题:若Spring的IOC容器和SpringMVC的IOC容器扫描的包有重合的部分,就会导致有的
             bean会被创建2次!
        解决:
            1.使Spring的IOC容器扫描的包和SpringMVC的IOC容器扫描的包没有重合的部分!
              controller层都在controller包,service层都在service包
            2.但是有的时候开发的时候是分模块开发的,这样不太容易做到,所以:
              可以在component-scan标签下面中使用如下子标签来规定只能扫描的注解:               

1     <context:component-scan base-package="com.neuedu">
2              <context:exclude-filter type="annotation" expression=""/>
3              <context:include-filter type="annotation" expression=""/>
4        </context:component-scan>        

            所以在springMVC的配置文件中我们可以按着如下配置,只扫描controller及ControllerAdvice注解:               

1 <context:component-scan base-package="com.neuedu" use-default-filters="false">
2          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
3           <!-- 处理全局异常 -->          
4          <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
5 </context:component-scan>              

            而在spring的配置文件中:              

1   <context:component-scan base-package="com.neuedu">
2            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
3            <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
4   </context:component-scan>      

       此时再重新启动项目就会发现spring和springmvc的对象都创建了一份!
       
      6.Spring的IOC容器和SpringMVC的IOC容器的关系
         注意:
            1.SpringMVC容器中的bean可以引用Spring容器中的bean,
              也就是在Controller中我们可以注入service层对象【可以在controller层的requestMapping方法中打印service对象试一下】!
            2.反之则不行,就是说:在spring扫描的service层不能引用springmvc的handler
              对象【注解一个小例子,启动项目就会出错】
            3.实际上Spring的容器和Spring容器有父子间关系,【参考图片】就想儿子可以继承父亲的基因一样,父亲没法继承儿子的基因!
              而且从另一个角度也说明了Handler是可以依赖Service层的,但是Service层却不可以依赖Handler层!
             

原文地址:https://www.cnblogs.com/kangxingyue-210/p/7488639.html