SSM整合详解
原文地址: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.youkuaiyun.com/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整合
版本要求
导包
<!--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容器中