Java入坑之代理

news2025/5/24 22:17:21

一、代理模式和静态代理

1.1代理模式

代理模式
- Proxy Pattern, 23个经典模式的一种,又称委托模式
-为目标对象提供(包装)了一个代理,这个代理可以控制对目标对象的访问

  • 外界不用直接访问目标对象,而是访问代理对象,由代理对象再调用目标对象
  • 代理对象中可以添加监控和审查处理

- David Wheeler(函数的发明者):All problems in computer science can be solved by another level of indirection。

1.2静态代理

 1.3静态代理代码演示

package org.example;

public interface Subject{
    public void request();
}

package org.example;

//目标对象
class SubjectImpl implements Subject {
    public void request() {
        System.out.println("I am dealing the request.");
    }
}
package org.example;

//代理对象
class StaticProxy implements Subject{
    //实际目标对象
    private Subject subject;
    public StaticProxy(Subject subject){
        this.subject = subject;
    }
    public void request(){
        System.out.println("PreProcess");
        subject.request();
        System.out.println("PostProcess");
    }
}
package org.example;

//静态代理模式
public class StaticProxyDemo {
    public static void main(String args[]) {
//创建实际对象
        SubjectImpl subject = new SubjectImpl();
//把实际对象封装到代理对象中
        StaticProxy p = new StaticProxy(subject);
        p.request();
    }
}

二、动态代理

2.1代理处理器

-持有目标对象的句柄
- 实现InvocationHandler接口

  • 实现invoke方法
  • 所有的代理对象方法调用,都会转发到invoke方法来
  • invoke的形参method,就是指代理对象方法的调用
  • 在invoke内部,可以根据method,使用目标对象不同的方法来响应请求 

 2.2代码示例

package org.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 创建一个接口,将会被代理
interface Calculator {
    int add(int a, int b);
}

// 创建一个实现了 InvocationHandler 接口的代理处理器类
class CalculatorInvocationHandler implements InvocationHandler {
    private Object target; // 被代理的对象

    public CalculatorInvocationHandler(Object target) {
        this.target = target;
    }

    // 实现 invoke 方法,用于处理代理对象上的方法调用
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在调用被代理对象的方法之前可以执行一些逻辑
        System.out.println("Before invoking " + method.getName());

        // 使用 Java 反射调用被代理对象上的方法
        Object result = method.invoke(target, args);

        // 在调用被代理对象的方法之后可以执行一些逻辑
        System.out.println("After invoking " + method.getName());

        return result; // 返回方法的结果
    }
}

public class DynamicProxyHandlerExample {
    public static void main(String[] args) {
        // 创建被代理的对象
        Calculator realCalculator = new Calculator() {
            public int add(int a, int b) {
                return a + b;
            }
        };

        // 创建代理处理器对象
        CalculatorInvocationHandler handler = new CalculatorInvocationHandler(realCalculator);

        // 使用 Proxy 类生成代理对象
        Calculator proxy = (Calculator) Proxy.newProxyInstance(
                Calculator.class.getClassLoader(),
                new Class[]{Calculator.class},
                handler
        );

        // 调用代理对象的方法
        int result = proxy.add(5, 3);
        System.out.println("Result: " + result);
    }
}

2.3代理对象

 三、AOP编程

AOP编程是一种软件开发技术,它可以将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,实现代码的模块化和复用。横切关注点是指那些影响了多个类或方法的功能,例如日志、安全、事务等。AOP通过在运行时或编译时动态地将切面(aspect)织入到目标对象中,来增强目标对象的功能。切面是由通知(advice)和切点(pointcut)组成的,通知定义了切面要做什么,切点定义了切面要在哪里做。

3.1优点 

  • 可以提高代码的可读性和可维护性,因为横切关注点被集中在一个地方,而不是分散在多个类或方法中。
  • 可以提高代码的复用性和扩展性,因为横切关注点可以被重用和修改,而不影响业务逻辑的核心功能。
  • 可以提高代码的稳定性和安全性,因为横切关注点可以对业务逻辑进行统一的处理,例如异常处理、事务管理等。

3.2常见应用场景

  • 日志记录:可以在方法的执行前后记录日志,方便调试和监控。
  • 权限检查:可以在方法的执行前检查用户的权限,防止非法访问。
  • 缓存管理:可以在方法的执行后将结果缓存起来,提高性能。
  • 性能统计:可以在方法的执行前后统计执行时间,优化性能。
  • 事务管理:可以在方法的执行前后进行事务的开启和提交,保证数据的一致性

3.3哪些框架使用了AOP

 AOP是一种软件开发技术,它可以将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,实现代码的模块化和复用。在Java中,有很多框架使用了AOP,例如:

  • Spring Framework:Spring Framework是一个提供了全面的编程和配置模型的Java企业级应用开发框架1。Spring Framework支持AOP,可以让开发者通过注解或XML配置的方式,定义切面(aspect)和切点(pointcut),并将它们织入到目标对象中,实现功能的增强2。Spring Framework的AOP模块主要基于动态代理(dynamic proxy)技术,也可以使用AspectJ编译器来实现静态织入(static weaving)。
  • AspectJ:AspectJ是一个基于Java语言的AOP框架,它扩展了Java语法,引入了新的关键字和语法结构,让开发者可以直接在源代码中定义切面和切点,并通过AspectJ编译器将它们编译成字节码。AspectJ提供了更强大和灵活的AOP功能,可以支持更多种类的切点和通知(advice),例如构造器调用、字段读写、异常处理等。
  • Guice:Guice是一个轻量级的依赖注入(dependency injection)框架,它可以让开发者通过注解的方式,声明对象之间的依赖关系,并自动创建和管理对象的生命周期。Guice也支持AOP,可以让开发者通过@Interceptor注解,定义方法拦截器(method interceptor),并将它们绑定到指定的切点上,实现功能的增强。Guice的AOP模块基于动态代理技术,只能拦截接口方法或非final类方法。

3.4面向切面与面向对象的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件外包开发bug管理工具

国内有一些常用的Bug管理工具,这些工具旨在帮助团队有效地发现、跟踪和解决软件开发中的缺陷和问题。以下是一些国内的Bug管理工具,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.禅道&…

在openSUSE上开启护眼模式

色温 色温是用来衡量光源色彩时所用到的一个概念,单位为开尔文。热黑体辐射体与光源温度相同时的温度,就是该光源的色温。 显而易见,色温越低时,光源看起来越黄;色温越高时,光源看起来越蓝。下面是一些常见…

【LangChain系列 9】Prompt模版——MessagePromptTemplate

原文地址:【LangChain系列 9】Prompt模版——MessagePromptTemplate 本文速读: MessagePromptTemplate MessagesPlaceholder 在对话模型(chat model) 中, prompt主要是封装在Message中,LangChain提供了一些MessagePromptTemplat…

入门必读:Python try except异常处理详解

Python 中,用try except语句块捕获并处理异常,其基本语法结构如下所示: try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块…

CSAPP Bomb Lab

CSAPP Bomb Lab 芜湖,完成实验来记录一下啦~ 这个lab看的我真是眼皮发麻,框框就是反汇编->c语言形式->优化c语言 最后我才能写出来,整的我睡觉都是 mov… lea… 难道适中,感觉只要耐心一点就没问题,好了现在开…

【鸿蒙(HarmonyOS)】List列表、ArkUI资源组数据类型

一、引言 描述:List列表在移动端设备中最为常见。比如:通讯录、短信、聊天软件等都,都拥有他的身影。难度:简单知识点:1、列表组件的使用2、认识ArkUI资源组数据类型 二、列表List 1、发现问题(Bug&…

2023-9-14 石子合并

题目链接&#xff1a;石子合并 #include <iostream> #include <algorithm>using namespace std;const int N 310, INF 1e9;int n; // 前缀和 int s[N]; int f[N][N];int main() {cin >> n;for(int i 1; i < n; i ) cin >> s[i];for(int i 1; i …

模式分类与“组件协作模式”

1. GOF-23 模式分类 从目的来看&#xff1a; 创建型&#xff08;Creational&#xff09;模式&#xff1a;将对象的部分创建工作延迟到子类或者其他对象&#xff0c;从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型&#xff08;Structural&#xff09;模式&#…

CS5366 typec转HDMI 4k60拓展坞方案芯片,带PD快充功能

CS5366是一个高性能的USB类型-c/显示端口到HDMI2.0转换器方案芯片&#xff0c;CS5366集成了一个DP1.4兼容的接收器&#xff0c;一个HDMI2.0兼容的发射器。此外&#xff0c;还包括两个CC控 制器&#xff0c;用于CC通信&#xff0c;以实现DP Alt模式和电源传输功能&#xff0c;一…

[设计模式] 浅谈SOLID设计原则

目录 单一职责原则开闭原则里氏替换原则接口隔离原则依赖倒转原则 SOLID是一个缩写词&#xff0c;代表以下五种设计原则 单一职责原则 Single Responsibility Principle, SRP开闭原则 Open-Closed Principle, OCP里氏替换原则 Liskov Substitution Principle, LSP接口隔离原则 …

怎样做一个简易而温馨的原木风居室空间

由 balbek bureau 设计的 Relogged 是一座重新设计的私人住宅&#xff0c;位于乌克兰河岸的绿化区。顾名思义&#xff0c;该项目重新诠释了木屋的概念&#xff0c;并与充满自然气息的环境相呼应&#xff0c;营造出宁静舒适的生活氛围。在探索重新设计的木屋实例时&#xff0c;建…

【rar技巧】安装了WinRAR,右键没有压缩选项,怎么回事?

我们安装了WinRAR之后想要压缩文件&#xff0c;但是右键点击文件之后发现并没有WinRAR压缩选项&#xff0c;这应该如何设置才能出现右键带有压缩选项呢&#xff1f;方法如下&#xff1a; 首先打开WinRAR&#xff0c;在上面功能中点击选项 – 设置 然后我们在设置界面中切换到集…

unity C#客户端与服务器程序

客户端和服务器公共的脚本 OSC.cs // This is version 1.01(2015.05.27) // Tested in Unity 4 // Most of the code is based on a library for the Make Controller Kit1/* using UnityEngine; using System; using System.Collections; using System.Threading; using Syst…

webpack 基础配置

常见配置 文件打包的出口和入口webpack如何开启一台服务webpack 如何打包图片&#xff0c;静态资源等。webpack 配置 loader配置 plugin配置sourceMap配置 babel 语法降级等 接下来 &#xff0c; 我们先从webpack的基本配置 开始吧&#xff01; 在准备 配置之前 , 搭建一个 …

PCL 生成空间三角形面点云

系列文章目录 第一章&#xff1a;PCL生成线段点云 第二章&#xff1a;PCL创建圆柱面点云 文章目录 系列文章目录前言一、三角形面是什么&#xff1f;二、三角形面点云创建步骤1.引入库2.创建三角形面点云 总结 前言 点云库 (PCL) 是一个独立的、大规模的、开放的 2D/3D 图像和…

nginx部署vue后显示500 Internal Server Error解决方案

今天部署vue前端项目一直报错500&#xff0c;无法显示出主页面。 一个以为是自己的dist位置没有访问正确或者nginx.conf的位置写的不对&#xff0c;&#xff0c;最后才发现&#xff01;是权限的问题&#xff01;&#xff01; 我要访问/home/ubuntu/myapp/ruoyi/ruoyi-ui/dist的…

python环境安装(windows)

1. python安装 一、官网下载安装包 打开python的 官网链接 https://www.python.org鼠标点击Downloads按钮 点击downloads后&#xff0c;下拉&#xff0c;找到如下界面&#xff0c;里面就是python的各个历史版本 找到想要下载的版本&#xff0c;点击Download后&#xff0c;下拉…

AI绘画Stable Diffusion原理之扩散模型DDPM

前言 传送门&#xff1a; stable diffusion&#xff1a;Git&#xff5c;论文 stable-diffusion-webui&#xff1a;Git Google Colab Notebook部署stable-diffusion-webui&#xff1a;Git kaggle Notebook部署stable-diffusion-webui&#xff1a;Git AI绘画&#xff0c;输入一段…

热缩膜机效果不好怎么办?

热缩膜机也称热收缩机或收缩包装机&#xff0c;主要是采用加热的原理对物品表面的薄膜进行加热收缩&#xff0c;多用于食品、药品、化妆品、纸箱等产品的外包装&#xff0c;使用过收缩机的用户都知道&#xff0c;热收缩机效果不好是常出现的问题&#xff0c;下面就从3个方面和您…

EndNote+有道

EndNote里面有划线翻译的功能&#xff0c;前提是你的电脑里面安装了有道翻译或者百度翻译的客户端。 我更喜欢有道&#xff0c;所以...... 然后点击“快速安装”。完了之后打开如下&#xff1a; 实现翻译的操作如下&#xff1a; ok。