Java入坑之代理

一、代理模式和静态代理

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.hqwc.cn/news/108813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重建大师提交空三后引擎状态是等待,怎么开启?

答:图片中这是在自由网空三阶段,整个AT都是等待中,可以修改任务目录和监控目录看一下,先设置引擎,再提交空三。

蓝牙资讯|苹果新款AirPods Pro支持Vision Pro无损音频和IP54防水防尘

苹果公司宣称,USB-C 能够带来更多灵活性,现在用户可以使用手机的 USB-C 接口,为 AirPods Pro 耳机盒充电。 虽然苹果没有详细介绍这款耳机,但在今天的新闻稿中依然透露了一些不一样的地方,例如新款 AirPods Pro 2 升…

k8s node环境部署(三)

1、添加node1、node2环境 前面配置master环境的截图最后一段 复制下来 分别在node主机执行 kubeadm join 192.168.37.132:6443 --token p5omh3.cqjqt8ymrwkdn2fc \ --discovery-token-ca-cert-hash sha256:608a1cbadd060cfdeac2fae84c19609061b750ab51bf9a19887ff7ea…

基于小程序的理发店预约系统

一、项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率,给人们带来很多的方便。计算机技术从很大的程度上解放了人们的双手,并扩大了人们的活动范围,是人们足不出户就可以通过电脑进行各种事情的管理。信息系…

dlib库详解及Python环境安装指南

dlib是一个开源的机器学习库,它包含了众多的机器学习算法,例如分类、回归、聚类等。此外,dlib还包含了众多的数据处理、模型训练等工具,使得其在机器学习领域被广泛应用。本文将详细介绍dlib库的基本概念、功能,以及如…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例,轻量4核8G12M服务器446元一年,CVM S5云服务器935元一年,相对于云服务器CVM,轻量应用服务器性价比更高,轻量服务器CPU和CVM有区别吗?性…

【C++】匿名对象 ① ( 匿名对象引入 | 匿名对象简介 | 匿名对象概念 | 匿名对象作用域 - 对象创建与销毁 )

文章目录 一、匿名对象引入二、匿名对象简介1、匿名对象概念2、匿名对象作用域 - 对象创建与销毁3、代码示例 - 创建并使用匿名对象 一、匿名对象引入 匿名对象引入 : 在上一篇博客 【C】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 ) 中 , 讲到了 如…

数据在内存中的存储

目录 数据类型 大小端 判断大小端 练习 1 2 浮点数在内存中储存 存M 存E 取E 数据类型 整形家族: char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed…

关于浅克隆和深克隆入门理解

浅克隆:需要类实现Cloneable,并重写clone()方法 一般在重写clone()方法时,将返回值类型强转为自己类,避免每次克隆之后需要强转 public class Test {public static void main(String[] args) throws CloneNotSupportedException {A a1new A();A a2 a1.clone();//克隆之后 a1…

实时测试工具 Visual Studio 扩展 NCrunch 4.18 Crack

NCrunch Visual Studio 扩展 .NET 的终极实时测试工具 在编码时查看实时测试结果和内联指标。 下载v4.18 发布于 2023 年 7 月 17 日 跳过视频至: 代码覆盖率 指标 分布式处理 配置 发动机模式 Visual Studio 自动并发测试 NCrunch 是一个完全自动化的测试扩展&a…

C++day7

仿照vector手动实现自己的myVector&#xff0c;实现二倍扩容功能 #include <iostream>using namespace std;template<typename T> class my_vector {int size;//可存储的容量大小int num;//当前存储的元素个数T* data;//存储数据的空间地址public://无参构造函数m…

怎么获取别人店铺的商品呢?

jd.item_search_shop(获得店铺的所有商品) 为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个JD应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载JDAPI的SDK并掌握基本的API…