展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Java AOP动态代理是什么

Java AOP动态代理是什么

1.IOC与AOP概念IOC:控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理。使用IOC的目的是为了降低耦合度。AOP:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP的底层实现是基于动态代理(实现方式是当切入接口

本文目录

      1.IOC与AOP概念

      IOC:控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理。使用IOC的目的是为了降低耦合度。

      AOP:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP的底层实现是基于动态代理(实现方式是当切入接口时,使用JDK原生动态代理;当切入普通方法时,使用cglib动态代理)。

      2.为何使用动态代理

      随着业务的不断扩展:

      (1)日志功能:如果日志代码修改,需要修改多处。

      (2)校验功能:如果多处需要校验,需要修改多处。

      这时就需要使用动态代理来解决问题,动态代理的实现方式有两种:

      [1]JDK原生动态代理:缺点是必须基于接口完成

      [2]cglib动态代理:他可以不用基于接口完成

      2.1 JDK原生动态代理

      Java AOP动态代理是什么

      2.1.1 MathService接口类
      public interface MathService {
          //+
          public Double add(double a,double b);
          //-
          public Double sub(double a,double b);
          //*
          public Double mul(double a,double b);
          ///
          public Double div(double a,double b);
      }
      2.1.2 MathServiceImpl实现接口类
      public class MathServiceImpl implements MathService{
          @Override
          public Double add(double a, double b) {
              Double result=a+b;
              return result;
          }
          @Override
          public Double sub(double a, double b) {
              Double result=a-b;
              return result;
          }
          @Override
          public Double mul(double a, double b) {
              Double result=a*b;
              return result;
          }
          @Override
          public Double div(double a, double b) {
              Double result=a/b;
              return result;
          }
      }
      2.1.3 ProxyFactory动态代理工厂
      public class ProxyFactory {
          //被代理对象
          private Object target;
          public ProxyFactory(Object target) {
              this.target = target;
          }
          //获取代理对象
          public Object getProxy(){
              /**
               * ClassLoader loader, 被代理对象的类加载器
               * Class[] interfaces, 被代理对象实现的接口
               * InvocationHandler h: 当代理对象执行被代理的方法时,会触发该对象中的invoke功能
               */
              ClassLoader loader=target.getClass().getClassLoader();
              Class[] interfaces=target.getClass().getInterfaces();
              InvocationHandler h=new InvocationHandler() {
                  @Override
                  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                      //可以加上需要的非业务代码
                      //method.getName()获取方法名
                      // Arrays.asList(args)获取输入值
                      System.out.println("this is "+method.getName()+" method begin with"+ Arrays.asList(args));
                      //method:表示代理对象要代理的方法
                      //invoke:回调该函数
                      //args:方法需要的参数
                      Object result = method.invoke(target, args);//代理对象回调该方法
                      return result;
                  }
              };
              //先写此处方法,才可找到上述三个方法填写方式
              Object o = Proxy.newProxyInstance(loader, interfaces, h);
              return o;
          }
      }
      2.1.4 测试类
      public class Test01 {
          public static void main(String[] args) {
              MathServiceImpl target=new MathServiceImpl();
              ProxyFactory proxyFactory=new ProxyFactory(target);
              MathService proxy = (MathService) proxyFactory.getProxy();
              Double add = proxy.add(15.0, 5.0);
              System.out.println(add);
          }
      }

      2.2 cglib动态代理

      Java AOP动态代理是什么

      2.2.1 MathServiceImpl类
      public class MathServiceImpl{
          public Double add(double a, double b) {
              Double result=a+b;
              return result;
          }
          public Double sub(double a, double b) {
              Double result=a-b;
              return result;
          }
          public Double mul(double a, double b) {
              Double result=a*b;
              return result;
          }
          public Double div(double a, double b) {
              Double result=a/b;
              return result;
          }
      }
      2.2.2 ProxyFactory动态代理工厂

      注意:

      (1)引入cglib的jar包.


        cglib
        cglib
        3.2.5
       

      (2)创建一个代理类工厂并实现接口MethodInterceptor

      public class ProxyFactory implements MethodInterceptor {
          private Object target;
          public ProxyFactory(Object target) {
              this.target = target;
          }
          //获取代理对象
          public Object getProxy(){
              Enhancer enhancer=new Enhancer();
              //指定被代理对象的父类
              enhancer.setSuperclass(target.getClass());
              //指定回调类
              enhancer.setCallback(this);
              //创建代理对象
              return enhancer.create();
          }
          //当代理对象执行代理方法时触发的方法
          public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
      //        System.out.println("before++++++++++++++++++++");
      //        Object result = method.invoke(target, args);
              //可以加上需要的非业务代码
              //method.getName()获取方法名
              // Arrays.asList(args)获取输入值
              System.out.println("this is "+method.getName()+" method begin with"+ Arrays.asList(args));
              //method:表示代理对象要代理的方法
              //invoke:回调该函数
              //args:方法需要的参数
              Object result = method.invoke(target, args);//代理对象回调该方法
              return result;
          }
      }
      2.2.3 测试类
      public class Test01 {
          public static void main(String[] args) {
              MathServiceImpl target=new MathServiceImpl();
              ProxyFactory proxyFactory=new ProxyFactory(target);
              MathServiceImpl proxy = (MathServiceImpl) proxyFactory.getProxy();
              Double add = proxy.add(1, 2);
              System.out.println(add);
          }
      }

      3.AOP动态代理

      Java AOP动态代理是什么

      3.1 添加对应依赖

      
            org.springframework
            spring-webmvc
            5.2.15.RELEASE
          
          
            org.springframework
            spring-aspects
            5.2.15.RELEASE
          

      3.2 配置spring.xml文件

      
      
          
          
          
          
      

      3.3 MathService接口类

      public interface MathService {
          public Double add(double a, double b);
          public Double sub(double a, double b);
          public Double mul(double a, double b);
          public Double div(double a, double b);
      }

      3.4 MathServiceImpl实现接口类

      @Service
      public class MathServiceImpl implements MathService {
          @Override
          public Double add(double a, double b) {
              Double result=a+b;
              return result;
          }
          @Override
          public Double sub(double a, double b) {
              Double result=a-b;
              return result;
          }
          @Override
          public Double mul(double a, double b) {
              Double result=a*b;
              return result;
          }
          @Override
          public Double div(double a, double b) {
              Double result=a/b;
              return result;
          }
      }

      3.5 LogAspect类

      @Service //若是使用@component也可以
      @Aspect //表示该类为切面类
      public class LogAspect {
          //任意返回类型 aop包下的所有类都有切面日志 使用通配符
          //第一个*:修饰符和返回值类型
          //第二个*:所有类
          //第三个*:所有方法
          @Before("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")
          public void before(){
              System.out.println("方法执行前的日志");
          }
          @After("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))") //总会被执行,不管有没有异常
          public void after(){
              System.out.println("方法执行后的日志");
          }
          @AfterReturning("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")//只有碰到return后才会执行
          public void afterReturning(){
              System.out.println("碰到return后执行");
          }
          @AfterThrowing("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")//异常通知
          public void afterThrowing(){
              System.out.println("出现异常了");
          }
      }

      3.6 测试类

      public class Test01 {
          public static void main(String[] args) {
              //从spring容器中获取
              ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
              MathService mathService = (MathService) app.getBean("mathServiceImpl");
              Double add = mathService.add(10, 5);
              System.out.println(add);
          }
      }
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      精品专题 更多
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      IOS软件

      正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

      AI

      正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw macOS版
      AionClaw macOS版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy macOS版
      Loomy macOS版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirBuddy 3 macOS版
      AirBuddy 3 macOS版

      AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

      AirServer macOS版
      AirServer macOS版

      AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

      AnyDesk macOS版
      AnyDesk macOS版

      AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

      讯飞绘文 网页版
      讯飞绘文 网页版

      讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

      Maya(Autodesk Maya) Windows版
      Maya(Autodesk Maya) Windows版

      Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

      Aperty Windows版
      Aperty Windows版

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw Windows版
      AionClaw Windows版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy Windows版
      Loomy Windows版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。