1.邂逅 S***
前言
记得大二上学期老师之一次讲 S*** 整合的时候,自己竟然浑浑噩噩睡过去了。
平时上课不好好听讲,后来听说期末要交大作业了,只能被迫去网上自学。
不对。。。少打个S,不过这真的是我之一次搜 S*** 的资料,当时室友还说我变态。
不过从那天起我带着尴尬的表情和搞定期末大作业的决心把 S*** 框架的整合认真研究了一遍。
S*** 框架
S*** 框架 是 Spring、springMVC、MyBatis 的缩写,这三个框架整合起来适用于搭建各种大型的企业级应用系统。
这个是继 SSH 框架之后,应用比较广泛的 java EE 企业级框架。
不过 2022 年了,我觉得这句话应该改改了,因为目前主流的企业级开发都是基于 SpringBoot 框架。
而 S*** 框架的整合目前更适合程序小白去做学习研究以及计算机专业大四生去做毕业设计。
2.如何整合 S***
1.框架之间的关系
我们在整合 S*** 之前,先看一下这些框架之间的关系。
Spring 和 SpringMVC
Spring 和 SpringMVC 都是用来管理对象的容器。
SpringMVC 主要用来管理 Controller ,Spring 主要用来管理 Service 和 Dao 以及其他对象。
所以我们在 SpringMVC 的配置文件里配置的注解扫描路径就是 Controller的路径,而 Spring 的配置文件配置的注解扫描路径会排除 Controller。
Spring 和 SpringMVC 是父子容器的关系。Spring 容器是父容器,SpringMVC 是子容器。
子容器可以访问父容器的对象,但是在父容器里不能访问子容器的对象。也就是说在 Controller 里可以访问 Service 对象,但是在 service 里不可以访问 Controller 对象。
SpringMVC 是 Spring 的子项目,属于 Spring 家族的一部分。所以在潜意识里,你可以认为他俩几乎是黏在一起的。
所以他俩基本是无缝整合的,说白了就是他俩不需要整合。
Spring 和 Mybatis
MyBatis 是一个基于 java 的持久层框架,它内部封装了 jdbc。它和 Spring 看起来好像没啥关系。
但是 Mybatis 开发过程中有很多痛点:
1.配置繁琐,我们需要配置实体类的别名、映射文件所在位置、数据源等。
2.创建 Mapper 麻烦。
3.Mybatis 接口调用比较繁琐:
// 1.读取配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); // 2.创建 SqlSessionFactory 工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); // 3.获取 sqlSession 对象 SqlSession session = factory.openSession(); // 4.使用 SqlSession 创建 Dao 接口的 *** 对象 UserDao userDao = session.getMapper(UserDao.class); // 5.执行接口的 *** List<User> userList = userDao.getAll(); ***代码
但是 Spring 可以帮助 Mybatis 解决这些痛点:
1.DataSource 可以作为 Spring 的一个 bean
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> ***代码
2.Spring 也可以管理 SqlSessionFactory 对象、设置实体类别名、管理 mapper 文件。
<!-- 管理mybatis操作数据库的会话对象SqlSession --> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 设置数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 设置类型别名 --> <property name="typeAliasesPackage" value="com.zhifou.model"></property> <!-- 设置映射文件的路径 --> <property name="mapperLocations" value="classpath:/mapper/*.xml"></property> </bean> ***代码
3.利用 Spring 的动态 *** 技术自动创建 Dao 接口的 *** 对象:
<!-- 在所设置的包下,将所有的接口生成动态 *** 实现类,并由spring容器管理 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zhifou.dao"></property> </bean> ***代码
2. 整合思路
表面看是 S*** 整合,实际上是 Spring 和 mybatis 的整合。
因为 Spring 和 SpringMVC 无缝整合,所以 SpringMVC 的配置基本不用动。
但是我们需要注意一点:
Spring 是用来管理对象的工厂,我们需要保证这个工厂只被创建一次。所以需要在 web.xml 配置 Spring 的监听器。当 Tomcat 一启动,自动初始化 Spring 的 IOC 容器,创建 Spring 的工厂。
3. 整合流程
我们先配置 SpringMVC:
1.创建 SpringMVC 的配置文件,配置注解扫描 controller、访问静态资源、视图解析器。
2.web.xml 配置中央调度器、字符过滤器
再整合 Spring 和 Mybatis
3.创建 spring 的配置文件,配置注解扫描排除 controller。
4.配置数据源
5.配置 SqlSessionFactoryBean
6.配置管理自动生成的 Dao 层的 *** 对象
7.配置事务管理
最后我们再配置 Spring 的监听器,启动项目自动初始化 Spring 容器。
8.在 web.xml 配置 Spring 的监听器。
3.基于配置文件方式整合 S***
这里我先讲一下基于配置文件的方式整合 S***。
1.创建基于 Maven 的 web 项目
2.引入依赖
<dependencies> <!-- 包含 beans、core、expression、aop 等依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.16.RELEASE</version> </dependency> <!-- 自动加载 Spring 工厂、支持文件上传等--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.16.RELEASE</version> </dependency> <!-- 封装 jdbc 、包含 spring-tx 事务管理依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.16.RELEASE</version> </dependency> <!-- 动态 *** --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.5</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> <!-- springmvc 核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- mybatis-spring 整合依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency> <!-- mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- json 格式转换--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.2</version> </dependency> </dependencies> ***代码
这里讲解一下部分引入的依赖:
(1)spring-context 包含 Spring 的所有核心依赖,所以只需要引入这一个即可。
(2)spring-jdbc 依赖包含 Spring 对 jdbc 的封装、事务的处理。
(3)mybatis-spring 是 mybatis、spring 整合需要的依赖 。
(4)jackson 相关的依赖是用来处理 json 格式的数据。
3.创建 SpringMVC 的配置文件,配置注解扫描 controller、访问静态资源、视图解析器。
4.web.xml 配置中央调度器、字符过滤器。
5.创建 spring 的配置文件,配置注解扫描排除 controller。
6.配置数据源
这里我们通过引入外部文件的方式配置数据源。
7.配置 SqlSessionFactoryBean
8.配置管理自动生成的 Dao 层的 *** 对象
9.配置事务管理
10.在 web.xml 配置 Spring 的监听器。
11.配置 Tomcat 并测试
成功!撒花!
12.完整代码
链接: https://pan.baidu.com/s/1lT9GjWCto-Cc0W4fm0KtGw 提取码: ocj9 ***代码
4.纯注解方式整合 S***
这里我们讲一下基于纯注解的方式整合 S***,创建项目和引入依赖的过程这里不再过多讲解, Maven 依赖和上面一样。
1.创建 SpringMVC 的配置类,配置注解扫描 controller、中央调度器、访问静态资源、视图解析器。
@EnableWebMvc:开启 MVC 的配置。
2.创建 DataSource 的配置类。
@PropertySource:表示引入外部文件资源。
@Value:表示为变量赋值。
3.创建 Spring 的配置类。
导入 DataSource 的配置类。配置sqlSessionFactoryBean、DAO 的 *** 对象、事务管理
@Import:导入整合其他配置类
@EnableTransactionManagement:开启事务管理。
4.创建替代 web.xml 的配置类
这个配置类就相当于 web.xml 的功能,当 Tomcat 启动的时候自动加载 Spring 和 SpringMVC 的配置类,初始化容器。
5.测试
成功!撒花!
6.完整代码
链接: https://pan.baidu.com/s/1LeRGaRTz7hpjJ9aHiOfZFg 提取码: tc2k
原文链接:https://juejin.cn/post/7095904556264980493