SSM整合详解

spring和spring mvc的关系

在整合三个框架之前,需要先知道必备的知识。

在前面的Spring MVC中我们提到了,Spring MVC是用来控制web层的一个框架,它有一个前端控制器,在项目初始化时会创建一个容器

在Spring中我们也提到了一点,那就是在Sping初始化时,我们也会创建一个容器。

那么现在问题来了,现在这两个容器,是最终合并只创立一个容器呢?还是分开创建两个容器,那它们之间的关系是什么?怎么来配置?

首先来讲讲第一个问题

Spring MVC是控制web层的,Spring是用来控制Service和Dao层的,所以我们肯定是创建两个容器分别进行管理。

然后是第二个问题,他们之间的关系

Spring作为父容器,Spring MVC作为子容器。Spring不能访问Spring MVC中的Bean,Spring MVC可以访问Spring中的Bean。

详情的话可以参考这两篇文章,我觉得写得不错

https://juejin.im/post/5a38be61f265da431c706d2d

https://blog.csdn.net/justloveyou_/article/details/74295728

Spring和SpringMVC的整合

在web.xml中配置

<!--
    专门为servletContext对象写初始化参数
-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-*.xml</param-value>
</context-param>
<!--
    是spring框架提供给我们 负责在项目启动的时候创建一个spring容器 但是容器启动需要配置文件
-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.gif</url-pattern>
</servlet-mapping>

项目启动后,ContextLoaderListener监听器会通过servletContext对象的初始化参数器创建Spring容器,创建完以后才会创建Spring MVC的容器,然后就形成了Spring MVC容器包含了Spring容器。也就是父子关系。

和Mybatis整合

版本要求

image-20200515162243160.png

导包

<!--mybati的包-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.1</version>
</dependency>
<!--阿里的数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.19</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<!--
    用来作为胶水把spring和mybatis合在一起
-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.1</version>
</dependency>

<!--支持事务和jdbc相关的-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

其中最重要的就是导入mybatis-spring

配置

创建一个spring-dao.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!-- 替代typeAliases-->
        <property name="typeAliasesPackage" value="com.chayedan.domain"/>
        <!--
            替代了原始sqlMapConfig中 mappers标签
        -->
        <property name="mapperLocations">
            <list>
                <value>classpath:/mapper/*.xml</value>
            </list>
        </property>
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--
        只需要在这个地方 告诉dao接口在哪个包下即可
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 配置你的dao接口所在包-->
        <property name="basePackage" value="com.chayedan.dao"/>
        <!-- 引用的sqlSessionFactory的名字-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

</beans>

MapperScannerConfigurer配置完以后,当Spring容器启动的时候,读到这个Bean标签,就会去扫描Dao层的接口,然后把接口通过sqlSessionFactory.getMapper()变成一个个dao对象,并且注入到Spring容器中