Spring-第三章
还原web项目的Test_Shop到Test_Shop_SM
Spring集成MyBatis
步骤
-
添加Spring,MyBatis相关jar包
参见共享,\Test_Shop_SM\jars -
复制applicationContext.xml,修改部分命名空间
-
测试一个ProductService例子
回顾当前配置下的加载顺序
- MyBatis的主配置文件mybatis-config.xml 和 工具类MyBatisUtil
- Mapper文件
- Dao接口
- Service接口
- Service实现
- 测试端
替代mybatis-config.xml 主配置文件的功能
使用Spring来集成该功能,Spring的IOC来替MyBatis生成工厂的特殊对象
创建数据连接,即数据源 取代
标签组
创建工厂
取代 标签组和MyBatisUtil 工具类
加载JDBC的配置文件 独立配置文件
修改为动态参数
测试打印 SqlSessionFactory
完成MyBatis对象的引入
版本1:
使用Spring IOC 创建dao对象,同时注入sqlSession配置
使用Spring IOC 创建service对象,并持有dao对象的引用
service层的实现类,持有dao对象的引用,并创建对应的set和get方法
完成ProductService的查询例子
- 检查原 MyBatisUtil工具类,依靠代理创建的对象
- 对比Spring IOC创建的对象
- 两者类型一致,说明Spring IOC创建的dao 对象
底层实现:SqlSession的MapperProxy代理实现 - Spring-IOC 创建的sqlSessionFactory对象,会自动完成事务的提交和流的关闭
移除mybatis-config.xml 配置文件,MyBatisUtil工具类,及相关配置
版本2:
dao层的动态代理
1. 特殊类MapperScannerConfigurer根据value值,找到接口的包
2. 将该包下所有的接口类名,改为 标准的对象引用命名(驼峰命名)
- 通过自动装配byType,实现自动注入SqlSession对象
- spring 容器中拥有这些 标准的对象引用名,可以直接被引用
- 底层实现:SqlSession的MapperProxy代理实现
Service层的自动装配
开启注解扫描,扫描Service的接口层
Service实现类标注注解
Service自动装配Dao对象,默认按照类型自动装配productDao
不再需要productService的bean标签和set/get方法了
Spring的专属Junit
总结:
1. Dao层的对象创建的底层实现,是MyBatis框架下的SqlSession对象,依靠MapperProxy动态代理技术实现
2. Service层的对象创建的底层实现,是依赖Spring-IOC 的bean-id来创建,不管是显示bean,还是自动装配。再底层细致,就是反射+无参构造方法
3. 层与层之间都必须有需要有Spring bean 的定义(不管是显示定义,还是隐藏定义)
4. 类与类之间的依赖 :
原始是通过在配置文件里写明ref实现;
升级后,靠注释自动装配@Autowired实现,但是底层还是靠ref实现
5. Spring的发展是代码和配置文件越来越简洁,通用代码被隐藏,但功能越来越强;
就像是社会的发展,原始是手工劳作,现在是机器自动化。
集成web
web.xml添加监听,用来加载Spring的主配置文件
标准配置文件路径
- 将配置文件放入config文件夹 (日志配置文件保留在根目录)
- 修改web.xml的监听路径
- 修改applicationContext.xml的jdbc.properties路径
- 修改SpringJunit 的注解applicationContext.xml路径
Test_Shop升级Spring架构
- Spring集成MyBatis框架,删除mybatis-config.xml和MyBatisUtil.java
- 修改Tesh_Shop_SM的业务逻辑层
- 使用SpringJunit测试所有业务逻辑层代码
个人总结
1. Spring取代原M框架下的哪些功能?
mybatis-config.xml 主配置文件的功能,代替数据库的连接
MyBatisUtil 工厂的创建及加载
取代Dao层对象,自动进行装配
取代Service层对象,自动进行装配
取代原有junit,进行更新
2. Spring 如何集成MyBatis的工厂类
使用类org.mybatis.spring.SqlSessionFactoryBean
注入数据库源
加载Maaper文件
配置实体类
3. 什么是参数分离?
使用jdbc.properties
使其参数相对应${}
4. Spring 集成版本1的实现
5. Spring 集成版本2的实现
6. Spring 集成web
7. 你对Spring框架的理解
1.Dao层的底层实现是通过sqlsession getMapper获得对象MapperProxy实现动态代理
2.Service的底层实现扫描包下带有@Service注解的类,通过扫描类反射保存到IOC的容器中,将依赖的bean进行注入 ,通过@Autowired进行自动装载
层与层之间进行封装,都交于spring进行维护与管理,
Spring越来越整洁,通用的逻辑都被隐藏,但是可维护性,和功能性更强。