spring教程 csdn(spring教程在线)

spring教程 csdn(spring教程在线)学习 AOP 之前需要了解代理模式 Proxy Pattern 什么是代理模式 综艺节目是不是会邀请戏子 戏子不会自己和节目方接触洽谈 戏子的经纪人负责对接节目方 洽谈各项事宜 并给戏子排期 安排行程等 戏子要做的就是在节目上卖力表演就行 别的事情不用操心 节目方是调用者

大家好,我是讯享网,很高兴认识大家。



学习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中的通知类型

通知类型        说明前置通知目标方法执行之前调用后置通知目标方法执行完成之后调用环绕通知目标方法执行前后都会调用,且能增强结果异常处理通知目标方法出现异常时调用最终通知无论程序执行是否正常,该通知都会执行。类似于try...catch中的finally代码块

AspectJ的切入点表达式

execution(

        [modifiers-pattern] 访问权限类型

        ret-type-pattern 返回值类型

        [declaring-type-pattern] 全限定性类名

)

 切入点表达式要匹配的对象就是目标方法的方法名

execution表达式中明显就是方法的签名

注意:表达式中加[]的部分表示可省略的部分,各部分间用空格分开,在其中可以使用以下符号

符号意义*0至多个字符..方法参数中表示任意多个参数,用在包名后表示当前包及其子包路径+用在类名后表示当前类及其子类,用在接口后表示接口及其实现类

 举例:

execution(public (..))指定切入点为:任意公共方法execution(*set*(..))指定切入点为:任何以“set”开头的方法execution(*com.xyz.service.*.*(..))指定切入点为:定义在service包里的任意类的任意方法execution(*com.xyz.service..*.*(..))指定切入点为:定义在service包或者子包里的任意类的任意方法。“..”出现在类名中时,后面必须跟“*”,表示包、子包下的所有类execution(.service.*.*(..))指定只有一级包下的service子包下所有类(接口)中的所有方法为切入点execution(..service.*.*(..))指定所有包下的service子包下所有类(接口)中的所有方法为切入点

基于注解的前置通知

公共接口

讯享网

目标对象

 

切面类

讯享网

配置文件

 

运行测试

讯享网

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

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

 

基于注解的后置通知

讯享网

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

基于注解的环绕通知

 

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

基于注解的异常通知

讯享网

基于注解的最终通知

 

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

讯享网

 

用来简化数据库操作

Bean

讯享网

配置文件注册jdbctemplate

 

持久层

讯享网

 

测试

讯享网

新增

删除

查询

数据库事务(DataBase Transaction):指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全不执行

事务处理可以确保:除非事务单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将这一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠

一个逻辑单元要成为事务,必须满足ACID(原子性 一致性 隔离性和持久性)属性

事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理

属性说明原子性(Atomic)事务的操作要么全部成功,要么全部失败,不会在中间的某个环节结束一致性(Consistency)数据库在一个事务执行之前和执行之后,数据库都必须处于一致性状态。如果事务执行失败,那么需要自动回滚到原始状态隔离性(Isolation)在并发环境下,不同的事务同时修改相同的数据时,一个未完成事务不会影响另外一个未完成事务持久性(Durability)事务一旦提交,其修改的数据永久保存到数据库中,其改变是永久的

 Bean

 

持久层

 

讯享网

 

 

业务层

讯享网

 

配置文件

讯享网

验证

 

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

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

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

注解实现事务

讯享网

 

小讯
上一篇 2025-04-25 08:56
下一篇 2025-04-17 11:02

相关推荐

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