给程序做增强
事务是最小的执行单元,转账,同时成功、同时失败
TxUtils类式事务管理类,有6个静态方法,可以直接通过类名来调用,threadlocal线程池,还有一个静态代码块,来加载链接
从数据源中获取链接,加入到线程池中保存链接,来保证事务用的是同一个链接
开启事务:获取链接获取到链接开启事务,如果没有获取到链接就创建一个链接
事务回滚、事务提交:都是在开启事务后执行的,一定有链接
关闭数据连接:如果数据连接不为空就关闭,并不是真的关闭,而是把链接还给数据库连接池。关闭数据连接意味着会话结束,线程池里的东西也要关掉
只做接口,不做实现
如果业务层里面实现多个业务(方法),每个方法都需要进行事务的开启、提交、回滚,这些都是重复行代码,产生了AOP。AOP的目的:通过代理商知道方法之前之后出现异常应该做什么。对程序进行横向的增强。
为什么要动态代理?
将增强的代码(开启事务、提交事务、事务回滚)提取出来成为一个复用的代码,那么业务层的方法秩序关注自己的业务逻辑,不需要关注事务了
代理类,目的:代理account service实现程序扩展,进行事务管理,目标对象只需要关注具体业务。
jdk动态代理是基于接口实现的
什么时候来创建对象、代理类的接口 (数组)、反射目标的方法------proxy.newproxyinstance()的三个参数
invoke(目标方法的类型,目标方法的参数)
AOP概念
· 耦合度降低,提高程序的可重用性,同时提高了开发的效率;
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
在不修改源代码的前提下,对程序进行增强!!(为什么要使用AOP)
AOP的优势:减少重复代码、提高开发效率、维护方便
AOP底层原理:jdk的动态代理
JDK的动态代理技术
1、为接口创建代理类的字节码文件
2、使用ClassLoader将字节码文件加载到JVM
3、创建代理类实例对象,执行对象的目标方法
AOP的相关术语
Joinpoint( 连接点 ) 所谓连接点是指那些被拦截到的点。在 spring 中 , 这些点指的是方法 , 因为 spring 只支持方法类型的连接点----------- 代理对象中被代理的方法
Pointcut( 切入点 ) -- 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义------- 在代理方法运行之前开启事务
Advice( 通知 / 增强 )-- 所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知 . 通知分为 前置通知(开启事务) , 后置通知(事务提交) , 异常通知(事务回滚) , 最终通知(资源关闭) , 环绕通知(前面的所有,但是需要自己写) ( 切面要完成的功能 )---------开启事务、事务提交、回滚事务、资源关闭
Target( 目标对象 )-- 代理的目标对象------------accountserviceimpl
Weaving( 织入 )-- 是指把增强应用到目标对象来 创建新的代理对象的过程
Proxy (代理) -- 一个类被 AOP 织入增强后,就产生一个结果 代理类
Aspect( 切面 )-- 是 切入点和通知 的结合,以后咱们自己来编写和配置的
AOP配置文件
导入三个依赖
<!-- AOP联盟 --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- Spring Aspects spring整合的--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!-- aspectj 切面类的--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.3</version> </dependency>
AOP案例
- 配置文件方式
代理类
切入点表达式
环绕通知
AOP的通知类型
1. 前置通知 目标方法执行前,进行增强。
2. 最终通知 目标方法执行成功或者失败,进行增强。
3. 后置通知 目标方法执行成功后,进行增强。
4. 异常通知 目标方法执行失败后,进行增强。环绕通知 目标方法执行前后,都可以进行增强。目标对象的方法需要手动执行
- 半注解方式
配置文件中开启AOP自动代理
- 纯注解
测试类加载配置类文件
拦截器方法执行两次,springmvc,由三个方法,在配置文件中配置,可以配置多个拦截器
过滤器javaweb的三大组件之一基于tomcat