Spring02之面向切面【AOP】

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Spring02之面向切面【AOP】

AOP中关键性概念🎇🎇🎇🎇


连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.


目标(Target):被通知(被代理)的对象

注1:完成具体的业务逻辑


通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例如一个实现日志记录的代码(通知有些书上也称为处理)

注2:完成切面编程


代理(Proxy):将通知(公共部分的代码,日志记录)应用到目标(具体的业务逻辑方法)对象后创建的对象(代理=目标+通知),

例子:外科医生+护士

注3:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的


适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)


如何实现AOP

目标对象只负责业务逻辑代码

通知对象负责AOP代码,这二个对象都没有AOP的功能,只有代理对象才有


1.什么是 AOP:


即向切面编程


2. AOP带来的好处:让我们可以 “专心做事”


连接点、目标、通知、代理

当方法被调用时,AOP将通知应用到目标上所创建的对象叫代理

代理=目标+通知,只有完整的代理对象才具备AOP特性,而AOP代码是写在通知中的。


案例:
   public void doSameBusiness (long lParam,String sParam){
     <---------------------  AOP
     //日志记录
     // 输入合法性验证
     if (lParam<=0){
          throws new IllegalArgumentException("xx应该大于0");
     }
     if (sParam==null || sParam.trim().equals("")){
          throws new IllegalArgumentException("xx不能为空");
     }
     // 异常处理
     try{ 
      ...   //核心业务逻辑
     }catch(...){
     }catch(...){
     }
     // 事务控制
     tx.commit();
   }


例子:病人做手术


    外科医生+护士


   主刀医生:理解为AOP中的目标,专注具体的业务逻辑操作

   麻醉师和护士:理解为AOP中的通知,在某种特定的连接点上执行的动作

   上述结合:AOP 代理对象:将通知应用到具体目标对象后创建对象

   代理=目标+通知

   只有代理对象才有AOP功能。


3 工具类org.springframework.aop.framework.ProxyFactoryBean用来创建一个代理对象,在一般情况下它需要注入以下三个属性:


 proxyInterfaces:代理应该实现的接口列表(List)

 interceptorNames:需要应用到目标对象上的通知Bean的名字。(List)

 target:目标对象 (Object)


4. 前置通知(org.springframework.aop.MethodBeforeAdvice):


在连接点之前执行的通知()

案例:在购书系统当中使用AOP方式实现日志系统


5. 后置通知(org.springframework.aop.AfterReturningAdvice):


在连接点正常完成后执行的通知

案例:在线购书系统中,要求不修改BookBizImpl代码的情况下增加如下功能:对买书的用户进行返利:每买本书返利3元。(后置通知)

即:每调用一次buy方法打印:“[销售返利][时间]返利3元。”


6. 环绕通知(org.aopalliance.intercept.MethodInterceptor):


包围一个连接点的通知,最大特点是可以修改返回值,由于它在方法前后都加入了自己的逻辑代码,因此功能异常强大。它通过MethodInvocation.proceed()来调用目标方法(甚至可以不调用,这样目标方法就不会执行)

案例:修改日志系统不光要输出参数,还要输出返回值(环绕通知)

//这个接口里面没有定义方法,我们要求我们的类必须实现afterThrows这个方法
public void afterThrowing( [Method method,] [Object args,] [Object target,] Throwable throwable );
//前面三个参数都是可选的,只有第三个参数是必须的,同时我们还可以在同一个类中定义这个方法的多个版本,如:
public void afterThrowing( MyException1 ex ) {}
public void afterThrowing( MyException2 ex ) {}
//具体那个方法被调用则根据具体的Exception来判断,由AOP容器自动识别 执行


7. 异常通知(org.springframework.aop.ThrowsAdvice):


这个通知会在方法抛出异常退出时执行

案例: 书本价格为负数时抛出一个异常,通过异常通知取消此订单


8. 适配器


(org.springframework.aop.support.RegexpMethodPointcutAdvisor) 适配器=通知(Advice)+切入点(Pointcut)

案例:通过适配器解决发书评时也返利的问题

*buy


9. 请使用接口接收返回的代理对象


        A    


 B            C    里氏替换原则


A:IBookBiz
  B:BookBizImpl implements IBookBiz
  C:Proxy implements IBookBiz
  IBookBiz bookBiz=new BookBizImpl(); 
  IBookBiz bookBiz=new Proxy();
  BookBizImpl bookBiz=(BookBizImpl)proxy;
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
21天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
27天前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
72 1
什么是AOP面向切面编程?怎么简单理解?
|
2月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
41 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
26天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
22天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
3月前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
2月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
88 2
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
136 9
|
2月前
|
Java 容器
AOP面向切面编程
AOP面向切面编程
43 0