Java 设计者模式以及与Spring关系(四) 代理模式

2024-01-23 16:12

本文主要是介绍Java 设计者模式以及与Spring关系(四) 代理模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

简介:

23设计者模式以及重点模式

代理模式(Proxy Pattern)

静态代理示例

spring中应用

动态代理

1.基于JDK的动态代理

target.getClass().getInterfaces()作用

内名内部类写法(更简洁,但不推荐)

2.基于CGLIB实现

spring中应用


简介:

本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。

23设计者模式以及重点模式

我们都知道设计者模式323种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。

(1)创建型模式:单例模式抽象工厂模式构建者模式工厂模式原型模式

(2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

(3)行为型模式:访问者模式、模版方法模式命令模式、迭代器模式观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式。

代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它通过提供一个替代对象(代理)来控制对另一个对象的访问。代理对象与原始对象实现相同的接口,这使得代理可以站在原始对象的位置被客户端使用,同时代理还可以在访问原始对象前后执行额外的操作,例如访问控制、延迟初始化、日志记录、监控等。

代理模式分为两类,常说的一般是动态代理。

类型:

  • 静态代理:手动创建代理类。

使用场景:在程序创建之前,代理类创建好的,代理目标是明确的可以使用静态代理。

  • 动态代理:在运行时动态创建代理类,Java 中可通过 Proxy 类和 InvocationHandler 接口实现。

使用场景:让编程人员在不修改对象代码的情况下,为这个对象添加额外的功能或者限制

静态代理示例

主要就是给金士顿的U盘算完各种折扣后75给淘宝,淘宝全都加25卖给客户,业务就是这个业务。

卖U盘的接口,定义一个U盘卖多少钱

制作优盘厂商实现类

代理类,淘宝类,在内部实现类中创建目标类对象引用,引用调用目标类方法,实现静态代理

自己进行购买

spring中应用

不知道你看出来了吗,这个像不像是我们spring框架中一个实现类调用另一个实现类方法。

动态代理

如果目标类很多呢,只是静态代理,那么需要创建的代理类就很多,比如上面的卖u盘例子,本来淘宝只卖金士顿,但是来个叫李帅帅的U盘厂家,但其实你只想想给这两个厂家做一样统一逻辑操作,比如还是加25块钱卖出去,这是就需要写第二个静态代理类,但如果有100个商品呢,这时就需要使用动态代理统一加载。

动态代理有两种实现方式

1.基于JDK的动态代理

目标类

动态代理类

method.invoke(target,args) 可以看做target.method(args)

实现类调用

target.getClass().getClassLoder() 得到目标类的实现类的类加载器

target.getClass().getInterfaces()它能够获得所实现这个对象的接口。其实这个接口不一定是目标类实现的接口,你看mybatis实现源码,接口就是任意接口。但是你要保证这第二个参数是个接口。

target.getClass().getInterfaces()作用

如果不懂这块的可以看看我这块,懂就略过

内名内部类写法(更简洁,但不推荐)

方法抽取放在一个别的类中方便使用

2.基于CGLIB实现

        动态代理有两种实现方式,一种是上述jdk的,核心是需要动态代理的目标类必须有接口还有一种是基于外部第三方类库的cglib,创建代理对象cglib不要求实现类也就是目标类去实现接口,cglib核心要求是继承目标类不能是finall。

        cglib 经常被应用在框架中,例如 Spring,Hibernat 等。cglib的代理效率高于 Jdk。对于 cglib 一般的开发中并不使用。做了一个了解就可以。

引入Jar包

<!--引入cglib依赖-->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.1_2</version>
</dependency>

spring中应用

在 Spring 框架中,代理模式被广泛用于实现 AOP(面向切面编程),例如在事务管理和安全控制中。

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、网页和系统设计,还有你是刚入职的新手需要度过试用期。请在关注私信我,本人看到一定马上回复!

这篇关于Java 设计者模式以及与Spring关系(四) 代理模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/636819

相关文章

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进