当前位置: 首页 > news >正文

SpringAOP_面向切面编程

一、什么是StringAOP

        AOP(Aspect-Oriented Programming: 面向切面编程):将那些与业务无关, 却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为“切面”(Aspect),便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

二、 Spring AOP 基于动态代理实现

○ 如果被代理的对象,已经实现某个接口,则 Spring AOP 会使用 JDK Proxy(反射),基于接口的方式,创建代理对象JDK动态代理的核心InvocationHandler接口Proxy类);

○ 如果被代理的对象,没有实现某个接口,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib,基于继承的方式,生成一个被代理对象的子类来作为代理(Cglib动态代理的核心MethodInterceptor接口Enhancer类);

 三、AOP通知类型

        AOP将抽取出来的共性功能称为通知;

        通知类型:以通知在上下文中的具体位置作为划分

  • 前置通知(Before)
  • 返回通知(After-returning)
  • 异常通知(After-throwing)
  • 后置通知(After)
  • 环绕通知(Around)

四、AOP连接点(Join point)

        AOP将所有的方法都视为连接点,不管是接口里面的抽象方法,还是实现类里面的重写方法,都是连接点

五、AOP切点(Pointcut)

        AOP将可能被抽取共性功能的方法称为切入点切入点是连接点的子集

六、AOP目标对象(Target)

       AOP目标对象 就是挖掉功能的方法对应的类生的对象,这种对象是无法直接完成最终工作的

七、AOP织入(Weaving)

AOP织入 就是将挖掉的功能回填动态过程

八、AOP切面

      AOP切面:  切点+通知

 九、SpringAOP+AspectJ实现步骤

1.添加依赖aopaspectj表达式的依赖

2.创建spring的主配置文件,bean内的命名空间要添加aop的

3.创建业务代码编写日志记录代码(事务管理代码)

4.将业务层与日志记录层注入spring容器

5.<aop:config>---aop配置

        aop:aspect---aop切面

                aop:before---通知内容与通知类型

十、切点表达式配置语法

execution(修饰符 返回值 包名称.类名称.方法名称(参数列表))

eg:

         execution(public void com.apesource.service.ServiceImp.findAll())

1.修饰符可以省略代表任意

        execution(返回值 包名称.类名称.方法名称(参数列表))

2.返回值可以使用“*”代表任意

        execution(* 包名称.类名称.方法名称(参数列表))

3.包名可以使用“*”代表任意名称

        execution(* *.*.*.类名称.方法名称(参数列表))

4.包名可以使用“..”代表任意个数

        execution(* *...类名称.方法名称(参数列表))

5.类名与方法名可以使用“*”代表任意

        execution(* *...*.*(参数列表))

6.参数列表可以使用".."代表任意个数任意类型

        execution(* *...*.*(..))

         如果有参数

                int======>int

                String===>java.lang.String

http://www.lryc.cn/news/422744.html

相关文章:

  • 芯片bring-up的测试用例
  • vs code编辑区域右键菜单突然变短
  • 如何将TRIZ的“最终理想解”应用到机器人电机控制设计中?
  • 【记录】基于docker部署小熊派BearPi-Pico H3863开发环境
  • Elasticsearch 与 OpenSearch:谁才是搜索霸主
  • WEB渗透-TomcatAjp之LFIRCE
  • 嵌入式初学-C语言-二一
  • 2376. 统计特殊整数
  • Python 绘图进阶之核密度估计图:掌握数据分布的秘密
  • 设计模式(1)创建型模式和结构型模式
  • RuoYi-Vue新建模块
  • Element-UI自学实践
  • ChatGPT如何工作:创作一首诗的过程
  • Linux_Shell变量及运算符-05
  • OpenCV图像滤波(13)均值迁移滤波函数pyrMeanShiftFiltering()的使用
  • 用爬虫技术探索石墨文档:数据自动化处理与个性化应用的创新实践
  • 【JavaEE初阶】线程池
  • zdpgo_cobra_req 新增解析请求体内容
  • Java聚合快递对接云洋系统快递小程序源码
  • 陕西西安培华学院计算机软件工程毕业设计课题选题参考目录​
  • 如何用sql在1分钟从1T数据中精准定位查询?Hive离线数仓 Spark分析
  • acpi 主板布局需要 efi
  • 月之暗面对谈 Zilliz:长文本和 RAG 如何选择?
  • 高级java每日一道面试题-2024年8月12日-设计模式篇-请列举出在JDK中几个常用的设计模式?
  • mysql workbench8.0如何导出mysql5.7格式的sql定义
  • 数据结构(学习)2024.8.6(顺序表)
  • MyBatis全解
  • 【Redis进阶】Redis集群
  • JVM运行时数据区之虚拟机栈
  • Python 机器学习求解 PDE 学习项目 基础知识(4)PyTorch 库函数使用详细案例