学习AOP之前需要了解代理模式 Proxy Pattern
什么是代理模式?
综艺节目是不是会邀请戏子,戏子不会自己和节目方接触洽谈。戏子的经纪人负责对接节目方,洽谈各项事宜,并给戏子排期,安排行程等,戏子要做的就是在节目上卖力表演就行,别的事情不用操心
节目方是调用者,戏子是目标类,经纪人就是代理类
- 代理类在程序运行之前就已经存在的代理方式
- 静态代理类通常由我们自己在java代码中定义
- 静态代理类和目标类会实现同一接口 或 派生自相同父类
案例演示:
创建项目 导入jar包

创建静态代理module

创建公共接口

创建目标类

创建代理类

测试


- 代理类在运行程序之前没有被创建,而是程序运行时才创建的代理方式
- 动态代理类并不是在java代码中定义的
- 动态代理类是在java代码中根据“指示”动态生成的
使用场景:
如果目标对象实现了接口,采用JDK的动态代理
声明接口

讯享网
创建目标对象

讯享网
实现代理

Proxy.newProxyInstance()
使用JDK创建动态代理对象用Proxy.newProxyInstance,参数列表有3个参数
第1参数是类加载器,用目标类反射得到类加载器就可以,当然,使用主类反射也是可以的
第2参数是目标类实现接口的数组,用目标类反射得到
第3参数是InvocationHandler,意为“调用处理”

我们需要重写其实现方法invoke,method.invoke涉及java基础中的反射,不再额外解释

使用场景
如果目标对象没有实现接口,我们是用不了JDK动态代理的,必须采用CGLIB动态代理
CGLIB 原理
动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快
CGLIB缺点
对于final方法,无法进行代理
创建目标对象

讯享网
创建CDLIG工厂

测试

讯享网
全名Aspect Oriented Programming,即面向切面编程
举个例子,正常的客户端请求是这样

面向切面以后,服务器端增加过滤拦截,服务器在响应前会先判定请求是否合理

面向切面是面向对象的一种方式而已,在代码执行过程中动态嵌入其他代码,叫做面向切面编程
- 日志
- 事务
- 数据库操作
- IOC/DI:本质就是java反射+XML解析(或java配置类)
- AOP:本质上java动态代理
- 切点:要添加代码的地方称作切点
- 切面:切点+通知
- 通知【增强】:向切点插入的代码称为通知Advice
- 连接点:切点的定义
面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中
所谓交叉业务逻辑,指通用的、与业务逻辑无关的代码,如安全检查、事务、日志等
若不使用AOP,则会出现代码纠缠,即:交叉业务逻辑和主业务逻辑混合在一起,使主业务逻辑变得混杂不清
切面(Aspect):
织入(Weaving):
连接点(JoinPoint):
切入点(PointCut):
通知(Advice):
顾问(Advisor):

前置通知(MethodBeforeAdvice):目标方法执行之前调用
公共接口

目标对象

讯享网
前置通知类

配置文件

讯享网
测试操作


后置通知(AfterReturningAdvice):目标方法执行完成之后调用
后置通知类

讯享网
配置文件

测试

环绕通知(MethodInterceptor):目标方法执行前后都会调用,且能增强结果
环绕通知类

讯享网
配置文件

测试

异常处理通知(ThrowsAdvice)目标方法出现异常调用
异常通知类

讯享网
配置文件

写一个bug

测试

基于AOP的编程思想,很多框架都进行了实现
Spring就是其中之一,可以完成面向切面编程
AspectJ也实现了AOP的功能,更便捷,支持注解式开发
所以,Spring将AspectJ对于AOP的实现也引入到了自己的框架中
AspectJ中的通知类型
AspectJ的切入点表达式
execution(
[modifiers-pattern] 访问权限类型
ret-type-pattern 返回值类型
[declaring-type-pattern] 全限定性类名
)
切入点表达式要匹配的对象就是目标方法的方法名
execution表达式中明显就是方法的签名
注意:表达式中加[]的部分表示可省略的部分,各部分间用空格分开,在其中可以使用以下符号
举例:
基于注解的前置通知
公共接口

讯享网
目标对象

切面类

讯享网
配置文件

运行测试

讯享网
观察运行结果知 com.bantang.aop.service包下所有类的所有方法在执行完成前 都先触发了前置通知

配置文件可以改为java配置类


基于注解的后置通知

讯享网
观察运行结果知 com.bantang.aop.service包下所有类的所有方法在执行完成后 都先触发了后置通知

基于注解的环绕通知

观察运行结果知 com.bantang.aop.service包下所有类的所有方法在执行前后 都先触发了环绕通知

基于注解的异常通知

讯享网


基于注解的最终通知

即使有报错 最终通知也一定会触发


讯享网


用来简化数据库操作
Bean

讯享网
配置文件注册jdbctemplate

持久层

讯享网

测试

讯享网
新增


删除


查询


数据库事务(DataBase Transaction):指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全不执行
事务处理可以确保:除非事务单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将这一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠
一个逻辑单元要成为事务,必须满足ACID(原子性 一致性 隔离性和持久性)属性
事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理
Bean

持久层

讯享网

业务层

讯享网

配置文件

讯享网
验证



update报错的时候 insert也没有成功


修改update 则insert和update一起执行成功

呀 出现了失误 不知道为啥update木有执行成功 烦死了 ![]()

注解实现事务

讯享网



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/194084.html