10,代理模式
为什么要学习代理模式?
因为这就是springAOP的底层! [SpringAOP和SpringMVC](面试必问)
代理模式的分类:
- 静态代理
- 动态代理
10.1 静态代理
角色分析
- 抽象角色 : 一般会使用接口或者抽象类来决定
- 真实角色 : 被代理的角色
- 代理角色 : 代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户 : 访问代理对象的人!
代码步骤 :
1. 接口
2. 真实角色
3. 代理角色
4. 客户端访问代理角色
代理模式的好处 :
- 可以使真实角色的操作更加纯粹!不用去在关注一些公共的业务
- 公共也就是交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理
缺点 :
- 一个真实的角色就会产生一个代理角色;代码量会翻倍,开发效率会变低~
10.2 加深理解
聊聊AOP
10.3 动态代理
- 动态代理和静态代理角色一样
- 动态代理类时动态生成的,不是我们直接写好的!
- 动态代理分为两大类 : 基于接口的动态代理,基于类的动态代理
- 基于接口的----JDK动态代理 [我们使用原生的JDK]
- 基于类的 : cglib
- java字节码实现 : JAVAssist
需要了解两个类 : Proxy 代理 / InvocationHandler 调用处理程序
InvocationHandler(反射包下的接口)
动态代理的好处 :
- 可以使真实的角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就交给代理角色!实现业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多个类,只要是实现了同一个接口即可
11.AOP
11.1 什么是AOP
AOP(Aspect Oriented Programming) 意为 : 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是一个软件开发的一个热点,也是Spring框架中的一个重要内容,是函数编程的一种衍生泛型.利用AOP可以对业务逻辑的各部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.
11.2 AOP在spring中的作用
==提供声明式事务: 允许用户自定义切面
- 横切关注点: 跨越应用程序多个模块的方法和功能.即是,与我们业务逻辑无关的,但是我们需要关注的部分,他就是横切关注点.如日志,安全,缓存,事务等等...
- 切面(ASPECT) : 横切关注点被模块化的特殊对象.即,他是一个类.
- 通知 (Advice) : 切面必须要完成的工作.即,他是类中的一个方法.
- 目标(Target) : 被通知的对象
- 代理(Proxy) : 向目标对象应用通知之后创建的对象.
- 切入点(PoinCut) : 切面通知执行的"地点"的定义
- 连接点 (Join Point) : 与切入点匹配的执行点
11.3使用Spring实现AOP
[重点] 使用AOP织入,需要导入一个依赖包!
方式一 : 使用Spring的API接口[主要是Spring接口实现]
方式二 : 自定义类实现API接口[主要是切面定义]
方式三 : 使用注解实现!
@Aspect // 标记该类为一个切面
JDK是基于接口实现的,cglib是基于类实现的
12,整合Mybatis
步骤:
1.导入相关jar包
- junit
- mybatis
- Mysql数据库
- spring相关的
- aop织入
- mybatis-spring[new]
2.编写配置文件
3,测试
12.1,回忆mybatis
mybatis的特点
- 简单易学 : 本身就小且简单,没有第三方依赖,最简单暗转只需要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。 - 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
1,编写实体类
2,编写核心配置文件
3.编写接口
4,编写Mapper.xml
5,测试:
12.2,mybatis-spring
Mybatis-spring 会帮助你将Mybatiis 代码无缝的整合到Spring中,它允许Mybatis参与到Spring的事务管理中,创建映射器mapper和Sqlsession 并注入到bean中,以及将Mybaits的异常转换为Spring的DataAccessException.最终,可以做到应用代码不依赖于Mybatis,spring或Mybatis-sprin
方式一:
编辑Spring xml文件 (编写数据源) (sqlSessionFactory) (sqlSessionTemplate)
编辑Mapper接口实现类
将Mapper交给Spring管理
在测试类中进行测试
方式二:
官方文档:
新建一个接口实现类,继承SqlSessionDaoSupport
将实现类交给spring容器管理
测试:
事务回顾
声明式事务:
1.回顾事务:
- 把一组业务当成一个业务来看,要么都成共,要么都失败
- 事务在开发的过程中十分重要,涉及到一致性的问题不能马虎!
- 确保完成性和一致性
2,事务的ACID原则:
- 原子性
- 隔离性
- 一致性
- 多个事务同时操作数据时,防止数据损坏.
- 持久性
- 事务一旦提交,无论发生什么问题,结果一定不会被影响,被持久化的写进了存储器中.
spring中的事务管理
- 声明式事务 : AOP
- 编程式事务 : 需要在代码中进行事务的管理
配置声明式事务
配置事务通知
给哪些方法配置事务:
aop方式编织事务的切入
思考:
为什么需要事务:
- 如果不配置事务,可能存在数据提交不一致的情况
- 如果我们不咋ISpring中配置事务,那么我们就需要在代码中手动配置事务
- 事务在项目的开发中十分重要,涉及到项目的完整性和一致性问题,不容马虎