SSM框架整合
Spring 和 springmvc 的关系
1.Spring和SpringMVC是父子容器关系。在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象,说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象
2.Spring整体框架的核心思想是容器,用来管理bean的生命周期,而一个项目中会包含很多容器,并且它们分上下层关系,目前最常用的一个场景是在一个项目中导入Spring和SpringMVC框架,而Spring和SpringMVC其实就是两个容器,Spring是父容器,SpringMVC是子容器,Spring父容器中注册的Bean对SpringMVC子容器是可见的,反之则不行。
3.按照官方文档推荐,根据不同的业务模块来划分不同的容器中注册不同的Bean,SpringMVC主要就是为我们构建web应用程序,那么SpringMVC子容器用来注册web组件的Bean,如控制器、处理器映射、视图解析器等。而Spring用来注册其他Bean,这些Bean通常是驱动应用后端的中间层和数据层组件。
Mybatis 如何单独实现
导入jar包之后,我们开始编写mybatis的配置文件,配置如下:
<!-- 为该包下的类配置别名 类名即全限定名 全限定名太麻煩 -->
<typeAliases>
<package name="cn.itsource.mapper"/>
</typeAliases>
<!-- 配置使用某一个环境 default 表示使用某一个--> //配置使用哪一个数据库连接
<environments default="development">
<environment id="development">
<!-- 采用的事务处理机制 -->
<transactionManager type="JDBC"/>
<!-- 使用的数据源类型 此处为连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="jdbc:mysql://localhost:3306/dbmstest?useUnicode=true&serverTimezone=GMT&useSSL=false"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
//指定mapper.xml文件生效
再看mybatis 实现数据库操作的流程:
通过MyBatis-Config.xml 文件构建一个SqlSessionFactory 对象,再获取SqlSession
public enum MybatisUilt {
INSTANCE;
static SqlSessionFactory factory;
// 工厂对象应该静态初始话
static {
try {
Reader reader = Resources.getResourceAsReader(“MyBatis-Config.xml”);
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
System.out.println(“读取mybatis 配置文件失败”);
e.printStackTrace();
}
}
// 获取session的方法
public static SqlSession getSqlSession() {
return factory.openSession();
}
}
在后续具体的数据访问操作中 通过SqlSession对象 指定获取某个Dao接口的mapper ,mapper对象相当于这个接口的实现类,我们可以通过这个mapper对象进行数据库操作
@Test
void testDeleteById() {
SqlSession session = MybatisUilt.INSTANCE.getSqlSession();
ProductDaoMapper mapper = session.getMapper(ProductDaoMapper.class);
mapper.deleteById(23L); //执行接口中的方法
session.commit();
session.close();
Spring 整合mybatis
Mybatis 运行需要那些? 需要dataSource获取数据库连接 需要告诉mybatis dao接口的数据库访问映射文件所在位置,通过这些信息生成SqlSessionFactory 对象 再获取SqlSession对象,最后获取mapper(功能上可以看作接口的实现类)、
基于Spring是对象管理框架,我们的dataSource 可以看作一个对象交给spring管理,SqlSessionFactory 对象是基于mybatis-config.xml文件生成的 也可以交给Spring管理,mybatis 需要被告诉mapper.Xml所在位置,然后生成mapper对象,可以让spring扫描mapper.xml文件所在位置 ,动态生成mapper对象,还可以配置事务等,导入spring整合mybatis的架包后,spring的applicationContext.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- 加载属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 将服务层交给spring 管理 -->
<context:component-scan base-package="cn.itsource.service"></context:component-scan>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&serverTimezone=GMT&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- springmvc 管理sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 配置mybatis (mapper)映射器路径 这里指明mapper.xml配置文件在哪里 -->
<property name="mapperLocations" value="classpath:cn/itsource/mapper/*Mapper.xml" />
<!-- 配置别名 -->
<!-- <property name="typeAliasesPackage" value="cn.itsource.domain" ></property> -->
</bean>
<!-- 映射器扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 这句可以省略,自动注册 -->
<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> -->
<!-- 这段配置会扫描指定包下的所有接口,然后创建各自接口的动态代理类。 -->
<property name="basePackage" value="cn.itsource.mapper"></property>
</bean>
<!-- 6. 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 7. 注解驱动,启动事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
Mybatis 就交给Spring管理了,不需要我们再去手动的获取SqlSessionFactory,mapper等对象
Springmvc 配置
<?xml version="1.0" encoding="UTF-8"?><context:component-scan base-package=“cn.itsource.controller”></context:component-scan>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
mvc:annotation-driven/
#{5*1024*1024}<!-- 配置一个拦截器 -->
Spring里面可以配置的东西Springmvc可以配置,可以看到这里很多配置依旧是基于bean,但是额外多了<mvc…>一类的配置。(拦截器是springmvc 特有的 基于aop 思想)
Spring Springmvc 和 web的关系
web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,web容器是无法识别的。
需要Servlet容器启动时 配置spring容器.
Tomcat在启动时给每个Web应用创建一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring容器提供宿主环境。
Tomcat在启动过程中触发容器初始化事件,Spring的ContextLoaderListener会监听到这个事件,它的contextInitialized方法会被调用,在这个方法中,Spring会初始化全局的Spring根容器,这个就是Spring的IoC容器,IoC容器初始化完毕后,Spring将其存储到ServletContext中,便于以后来获取。
Tomcat在启动过程中还会扫描Servlet,一个Web应用中的Servlet可以有多个,以SpringMVC中的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个Servlet请求。
Servlet一般会延迟加载,当第一个请求达到时,Tomcat&Jetty发现DispatcherServlet还没有被实例化,就调用DispatcherServlet的init方法,DispatcherServlet在初始化的时候会建立自己的容器,叫做SpringMVC 容器,用来持有Spring MVC相关的Bean。同时,Spring MVC还会通过ServletContext拿到Spring根容器,并将Spring根容器设为SpringMVC容器的父容器,请注意,Spring MVC容器可以访问父容器中的Bean,但是父容器不能访问子容器的Bean, 也就是说Spring根容器不能访问SpringMVC容器里的Bean。说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。
Web.xml
<?xml version="1.0" encoding="UTF-8"?> spring-web org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 dispatcherServlet / characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 characterEncodingFilter /*