springAOP

SpringAOP详解+快速入门 本文介绍了 Spring AOP 的实现原理,并通过实例解析详细阐述了其实现过程。在使用 Spring AOP时,我们需要定义切面类,并为需要实现AOP的方法添加注解。 Spring 会自动将切面逻辑插入到这些方法中,从而实现AOP的功能。 阅读详情

springAOP

前言:
  • 静态代理
    静态代理类:
    1、原则:和目标方法类功能一致且和目标类实现同样的接口。
    2、缺点:

    • 往往在开发我们自己写的不仅仅是一个业务,两个业务,而我们的业务会有很多,如果每一个业务开发一个静态代理类,不仅没有减少我们的工作量,而且让我们的工作量多了很多。
    • 如何解决这个问题?能不能为我们现有的业务层动态的创建代理类,通过动态代理去解决我们现有的业务层中的业务代码冗余问题。
  • 动态代理

    通过jdk提供的Proxy类,动态为现有的业务生成代理类。

代码示例:

/**
 * JDK中的动态代理
 * @author MOTUI
 *
 */
public class TestUserServiceImplDynamicProxy {
    public static void main(String[] args) {
        final UserService userService = new UserServiceImpl();
        //使用JDK提供的Proxy对象,用来产生动态代理类
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Class<?>[] interfaces = {UserService.class};
        InvocationHandler h = new InvocationHandler() {
            //参数1:生成的代理对象
            //参数2:当前调用的方法对象
            //参数3:当前带哦啊用方法参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                try {
                    System.out.println("开启事务");
                    //调用真正的业务逻辑
                    Object invoke = method.invoke(userService, args);
                    System.out.println("提交事务");
                    return invoke;
                } catch (Exception e) {
                    System.out.println("回滚事务");
                    e.printStackTrace();
                }
                return null;
            }
        };
        //参数1:当前线程的类加载器   加载.class文件
        //参数2:生成代理的对象的目标类的接口类型
        //参数3:当通过代理对象去调方法时,会优先进入InvocationHander类的invoke方法
        UserService userServiceProxy =  (UserService) Proxy.newProxyInstance(loader, interfaces, h);//返回静态代理对象
        //userServiceProxy.save();
        String query = userServiceProxy.query("小王");
        System.out.println(query);
    }
}

学习AOP需要知道几个重要的概念:

  • 通知(Advice):处理目标方法以外的操作都称之为通知
  • 切入点(PointCut):要为哪些类中的哪些方法加入通知
  • 切面(Aspect): 通知 + 切入点

    • 前置通知:
      代码:

      public class RecordMethodNameBeforeAdvice implements MethodBeforeAdvice {
      
          /**
           * 参数1:当前目标类中调用的方法对象
           * 参数2:当前目标类中调用的方法的参数
           * 参数3:目标对象
           */
          @Override
          public void before(Method method, Object[] args, Object target)
                  throws Throwable {
              System.out.println("当前执行的方法:"+method.getName());
          }
      
      }

      配置文件:

          <!-- 管理Bean -->
          <bean id="userService" class="com.motui.first.UserServiceImpl"/>
          <!-- 配置通知 -->
          <bean id="methodBeforeAdvice" class="com.motui.first.RecordMethodNameBeforeAdvice"></bean>
          <!-- 配置切面 -->
          <aop:config>
              <!-- 配置切入点 
              expression:指定哪个类的那个方法需要加入通知-->
              <aop:pointcut expression="execution(* com.motui.first.UserServiceImpl.*(..))" id="pc"/>
              <!-- 组合切入点和通知 -->
              <!-- 
                  advice-ref:告诉当前切面使用的是哪个通知 书写通知bean的id
                  pointcut-ref:当前通知加入哪个切入点
               -->
              <aop:advisor advice-ref="methodBeforeAdvice" pointcut-ref="pc"/>
          </aop:config>
    • 后置通知:
      代码:

      public class MyAfter implements AfterReturningAdvice ,ThrowsAdvice {
      //参数1: 目标类中当前执行的方法的返回值
      //参数2: 目标类中当前执行的方法对象
      //参数3: 目标类中当前执行的方法的参数
      //参数4: 目标对象
      @Override
      public void afterReturning(Object result, Method m, Object[] args,
              Object traget) throws Throwable {
          System.out.println("返回值:"+result);
          System.out.println("当前目标类的目标方法"+m.getName());
          System.out.print("参数列表:");
          if (args.length>0) {
              for (Object object : args) {
                  System.out.println(object);
              }
          }else{
              System.out.println("参数为空");
          }
          System.out.println("目标:"+traget);
      }
      
      //出现异常时进入的通知方法
      public void afterThrowing(Method method, Object[] args, Object target,Exception ex){
          System.out.println("异常通知的方法的名称: "+method.getName());
          System.out.println("异常通知的方法的参数: "+args);
          System.out.println("异常通知的目标对象"+target);
          System.out.println("异常通知的异常的信息 :" +ex.getMessage());
      }
      }

      配置文件:

      <!-- 管理bean -->             
      <bean id="deptService" class="com.motui.after.DeptServiceImpl"/>
      <bean id="myAfter" class="com.motui.after.MyAfter"/>
      <!-- 配置切入点 -->
      <aop:config>
      <aop:pointcut expression="execution(* com.motui.after.DeptServiceImpl.*(..))" id="pc"/>
      <aop:advisor advice-ref="myAfter" pointcut-ref="pc"/>
      </aop:config>
    • 环绕通知:
      代码:

      /**
       * 记录运行时长
       * @author MOTUI
       *
       */
      public class TestAroundAOP implements MethodInterceptor{
      
          @Override
          public Object invoke(MethodInvocation mi) throws Throwable {
              System.out.println("记录运行时长");
              long start = new Date().getTime();
              Object proceed = mi.proceed();//返回值为目标方法的返回值,这个返回值在通知类中返回
              long end = new Date().getTime();
              System.out.println("运行时长:"+(end-start));
              return proceed;
          }
      
      }

      配置文件:

          <!-- 管理Service -->
      <bean id="addressService" class="com.motui.around.AddressServiceImpl"/>
      
      <bean id="testAroundAOP" class="com.motui.around.TestAroundAOP"/>
      <!-- 配置切入点 -->
      <aop:config>
          <aop:pointcut expression="execution(* com.motui.around.AddressServiceImpl.*(..))" id="pc"/>
          <aop:advisor advice-ref="testAroundAOP" pointcut-ref="pc"/>
      </aop:config>
    • 异常通知:

      代码在后置通知中。

    • execution表达式:

      execution(返回值类型 包名.类名.方法名(参数列表))
      示例:
              execution(* com.motui.service.impl.UserServiceImpl.save(..))
                  返回值:任意
                  包:com.motui.service.impl
                  类:UserServiceImpl
                  方法:save
                  参数:任意
      
              execution(* com.motui.service.impl.UserServiceImpl.*(..))
                  返回值:任意
                  包:com.motui.service.impl
                  类:UserServiceImpl
                  方法:任意方法
                  参数:任意
      

在spring中有两种代理模式(JDK中的proxy和CGLIB):
在spring配置文件中可以通过proxy-target-class属性指定,true是CGLIB代理;false是Proxy代理

总结:

    Spring的核心思想
    IOC:控制反转    DI:依赖注入
    AOP:面向切面的编程思想
            AOP:通过动态为现有项目中的目标类创建代理对象,解决项目中的一些通用问题。
            AOP几个重要概念:
            通知(Advice):除了目标方法以外的操作称之为通知
            切入点(Pointcut):项目中的哪些类的哪些方法需要加入通知
            切面(Aspect):通知 + 切入点
    AOP的底层实现
            1、JDK的动态代理  Proxy   基于接口生成的代理
            2、Spring CGBIL (CGLIB用来生成动态代理) 基于实现类生成的代理
            3、JDK Proxy和CGLIB生成代理的区别?
                Proxy根据接口生成动态代理对象,产生对象的返回值是接口类型
                CGLIB根据实现类生成代理对象,产生对象的返回值是实现类类型(目标类型)
SpringAOP在项目中的简单应用 SpringAOP在项目中的简单应用   一、前言   项目背景 由于公司的机房到期,需要做应用迁移(包括数据库),割接到云平台。但是又不能进行一次性割接,需要分三个阶段:第一阶段割接2个地市,第二阶段再割接9个地市,第三阶段做全盘割接。在第一、第二阶段是要保证云平台与现网平台的应用能够正常并行运行。所以,要保证两边数据访问的正常,需要对某些功能进行改造。比如,某个子功能在并行阶段是不做... 阅读详情

相关推荐

PLC与变频器联动控制:从开关量、模拟量到通讯的接线与编程实战

在工业自动化系统中,电机调速控制是核心需求之一,其关键在于实现可编程逻辑控制器(PLC)与变频器之间的可靠联动。其基本原理是通过PLC输出控制信号,由变频器接收并驱动电机按设定速度运行。这项技术的核心价值在于实现电机的软启停、精确调速与节能控制,广泛应用于风机、水泵、传送带及精密张力控制等场景。其中,开关量控制以其接线简单、抗干扰能力强的特点,成为基础且可靠的方案;而模拟量控制则能实现无级平滑调速,满足更高精度的工艺要求。本文以西门子、三菱等主流品牌为例,深入解析了这两种主流控制方式的硬件接线、参数设置与梯

1268

SpringAOP学习--SpringAOP简介及原理

前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。 Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利。 前文提到AOP的实现有AspectJ、JDK动态代理、CGLIB动态代理,SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。 JDK动态代理回顾 上一篇简单介绍了

u012098021的博客 6万+

飞书应用开发脚手架lark-harness:从零构建企业级机器人

在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes

weixin_30703911的博客 612

SpringAOP是啥,怎么用?

SpringAOP是啥,怎么用? 一、面试问题:什么是SpringAOP? SpringAOP的全称是(Aspect Oriented Programming)中文翻译过来是面向切面编程,个人理解:主要意思是我们的传统架构至上而下,后期想要从中间切入写代码添加功能,比如日志、权限、事务等,这时候我们就需要写使用代理模式写,而springaop就是专门把这一块写代码的地方给抽象了出来称为切面,从而解决的代码混乱的问题,它的底层实现也是基于代理模式(动态代理)完成的。 二、SpringAOP的应用场景有

Object_de_Father的博客 19万+

从零构建HFSS连接器仿真模型:以SMP接口的精准复现为例

本文详细介绍了如何从零构建HFSS连接器仿真模型,以SMP接口的精准复现为例。通过获取官方模型、导入技巧、信号路径提取和介质结构复现等步骤,帮助工程师避免常见错误,提升高频电路仿真的准确性。文章特别强调了模型精度对仿真结果的影响,并提供了实用的调试和管理建议。

weixin_29041767的博客 429

手把手教你设计2bit反射型超表面:从单patch扫参到pin管配置全流程

本文提供了一份2bit反射型超表面设计的完整工程实践指南。从单贴片谐振器的参数化扫描与“270度法则”应用,到PIN二极管等效电路模型的获取与集成,再到利用参数化扫描高效仿真四种工作状态,手把手指导读者完成从单元设计到阵列布局、偏置线集成及加工考量的全流程,旨在帮助射频工程师将概念转化为可加工测试的实体模型。

java5的博客 1021

SpringAOP面向切面编程

介绍面向切面编程的思想(AOP),AOP的组成,SpringAOP的简单演示使用,SpringAOP基于动态代理的实现原理。

trong_ 的烂笔头 2544

VS Code配置MinGW64编译非线性优化库NLopt

VS Code用MinGW64编译C++代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。:若使用非UCRT版本(如传统MinGW64),替换所有路径中的。库文件会自动安装到MSYS2的。

weixin_30777913的博客 902

SpringAOP超详细教学

SpringAOP 前言 我的这篇AOP博客有大量的图片和例子教会怎么使用AOP 配置那里如果没有学习Maven的话也别急 就是使用maven下载了jar包而已了 你完全可以自己手动导入 如果你有一些代码比如说 事务 或者 日志等操作 需要大量嵌入你的代码前后的话 那么无疑AOP是最好用的 AOP运行流程 : 首先调用前置通知(你可以认为最一开始初始的东西)-&amp;gt;你的逻辑代码(这里先不说环...

TheSevenSky 8514

从零开始之stm32之CAN通信

CAN通信极简教程(小白友好版),从小白的视角了解并实现简单的STM32F103的CAN通信,直接上手。

qq_30993593的博客 1306

被搜狗输入法背刺了!偷偷装的 “AI 汪仔” 狂占 CPU!手把手教你如何彻底关闭删除搜狗AI功能AI汪仔

手把手教你如何彻底关闭删除搜狗输入法的AI汪仔🚀

XiaoqiangClub的博客 2万+

SpringAOP

简要介绍SpringAop的概念及其注解用法

山中一扶苏的博客 1032

31.华为路由器:PPPOE配置模拟实验及NAT配置

实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 The number of interface

迷逝 8116

关于SpringAOP的详细介绍

关于springAOP的记录

IDEA_guo的博客 989

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SpringAOP和AspectJ有什么关系 ?

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉✨特色专栏:🥭本文内容:SpringAOP和AspectJ有什么关系?📚个人知识库:,欢迎大家访问我们知道现在开发都是Spring,讲的最多的也是SpringAOP,在说springAOP前,先了解下AOP是什么?AOP是通过 “预编译方式” 和 “运行期间动态代理” 实现程序功能的统一维护的一种技术。

分享思想,留下痕迹。 1734

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【springBoot】springAOP

如果其他类需要使用,需要把切点声明为public.使用时,类的全限定名称+切点名称 ==> 包+类名@Slf4j@Aspect@Component@After("com.example.aopdemo.aspect.AspectDemo.pt()")//前置通知log.info("执行AspectDemo1 doAfter……");

weixin_66409969的博客 1047

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringAop(1)

一种规则Pointcut 的作⽤就是提供⼀组规则 (使⽤ AspectJ pointcut expression language 来描述), 告诉程序对哪些⽅法来进⾏功能增强。也就是@Around后边的字符串,描述了在哪里进行切入。对哪些的方法进行功能增强。(告诉哪些能被连接成切面,哪些不能被连接成切面,哪些能被Aop认识到,就是寻找匹配项)。这是切面的设置以及切面的逻辑@Slf4j@Component@Aspect//作用的范围是TestController。

syx050403的博客 1190

基于注解的SpringAOP Redis缓存技术

这篇博文主要介绍如何使用SpringAOP + Redis +注解的方式实现缓存的开发。 一、术语说明 1、SpringAOP AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP基于IOC基础,是对OOP的有益补充。SpringAOP的可配置式,使得代码几乎没有耦合侵入。 2、Redis Redis是一个开源的使用ANSI C语言编写、

chentian610的博客 5007

面试遇到SpringAOP不要慌

Aspect Oriented Programming(面向切面编程)是一种编程思想。所谓切面可以理解为特定的一些方法。所以AOP可以看成是面向特定的方法进行编程。比如上一篇文章提到的拦截器,就是AOP的体现。它针对特定的方法进行统一的管理,让代码模块化,易于维护。包括ExceptionAdvice、ResponseBodyAdvice(统一异常处理、统一数据返回格式)都运用了AOP的思想。定义一个注解:@Retention(RetentionPolicy.RUNTIME)//表示运行时,仍然存在。

HYY的博客 1211

springAOP落地实现

江湖阳哥曾经说过这么句话:使用技术在当前这个环境中无非就是这么几步:1、引入POM(maven)坐标2、改yml(配置文件也可以是properties等等)3、写配置类或者在启动类上加注解4、写代码就完事提示:以下是本篇文章正文内容,下面案例可供参考好了尽情的开发使用吧,其实这个是为了我写那个面试题的文章准备的哈哈哈哈。

sutingStart的博客 2128

SpringAOP使用

一、AOP介绍 AOP ,面向切面编程,在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。其实就是在代码运行,进行一定的包装,如在方法执行前、方法返回后、方法抛出异常后等地方进行一定的拦截处理或者叫增强处理 先讲一下AspectJ和Spring AOP关系,网上很多文章对AspectJ存在错误说法 AspectJ: AspectJ 来自于 Eclipse 基金会,...

LJJZJ的博客 586
上一篇: webService之Apache CXF
下一篇: shiro 使用缓存时出现:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource
motui
博客等级 码龄10年 84粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值