wordpress 采集评论/抖音seo是什么
代理模式
为什么要学习代理模式?因为这就是SpringAOP的底层!
代理模式的分类:
- 静态代理
- 动态代理
静态代理
角色分析: - 抽象角色:一般会使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:访问代理对象的人!
代码步骤:
1.接口
2.真是角色
3.代理角色
public class Proxy implements Rent {private Host host;public Proxy() {}public Proxy(Host host) {this.host = host;}@Overridepublic void rent() {seeHouse();host.rent();hetong();fare();}//看房public void seeHouse(){System.out.println("中介带你去看房子");}//签租赁合同public void hetong(){System.out.println("签租赁合同");}//收中介费public void fare(){System.out.println("收中介费");}
}
4.客户端访问代理角色
代理模式的好处
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共任务也就交给代理角色,实现了业务的分工
- 公共业务发生拓展的时候,方便集中管理
缺点: - 一个真实的角色就会产生一个代理角色,代码量就会翻倍~开发效率会变低
动态代理
- 动态代理和静态代理角色一样
- 动态代理的代理类是动态生成的,不是我们直接写好的!
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口—jdk动态代理(我们在这里使用)
基于类:cglib
java字节码实现:javasist 这个一般用于jboss服务器开发
需要了解两个类:proxy 代理, InvocationHandler: 调用处理程序
proxy: 生成动态代理实例的
InvocationHandler:调用处理程序,并返回处理结果的
动态代理的好处:
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共任务也就交给代理角色,实现了业务的分工
- 公共业务发生拓展的时候,方便集中管理
- 一个动态代理类代理的是一个接口,一般就是对应一类业务
- 一个动态代理类可以代理多个类,只要是实现了同一个接口即可
AOP
AOP意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是oop的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型,利用AOP可以对各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率
AOP在Spring中的作用
提供声明式事务;允许用户自定义切面
- 横切关注点:跨越应用程序多个模块的方法或功能,即使,与我们的业务逻辑无关的,但是我们需要关注的部分,就是横切关注点,如日志,安全,缓存,事务等等。。。
- 切面(ASPECT):横切关注点被模块化的特殊对象,即,他是一个类
- 通知(Advice):切面必须要完成的工作,即,他是类中的一个方法
- 目标(Target):被通知的对象。
- 代理(Proxy):向目标对象应用通知之后创建的对象
- 切入点(PointCut):切面通知执行的“地点”的定义
- 连接点(JoinPoint):与切入点匹配的执行点
声明式事务
回顾事务把一组业务当做一个业务来做,要么都成功,要么都失败!事务在项目开发中,十分重要,涉及到数据的一致性问题,不能马虎!确保完整性和一致性;
事务ACID原则:
- 原子性:事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败。
- 一致性:事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说数据库处于一致性状态。如果在执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于不一致状态。
- 隔离性:一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间互相不干扰。
多个业务可能同时操作一个资源,防止数据损坏 - 持久性
事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中
事务的隔离级别:
事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读已提交)、read repeatable(可重复读,Mysql默认隔离级别)、serializable(串行化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
- read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
- read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
- repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。
- serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。
脏读,不可重复读,幻象读概念说明:
- 脏读:指当一个事务正字访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。
- 不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
- 幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)
拓展: 关于mysql的幻象读与不可重复读的区别
拓展:关于mysql共享锁与排他锁的区别
Spring事务传播特性
事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为:
- propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
- propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
- propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
- propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
- propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
- propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。
spring中的事务管理
- 声明式事务: AOP
- 编程式事务: 需要在代码中,进行事务的管理
思考:为什么需要事务?
- 如果不配置事务,可能存在数据提交不一致的情况下
- 如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务!
- 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎