当前位置: 首页 > wzjs >正文

百度网盘做网站cdq百度指数

百度网盘做网站,cdq百度指数,如何让网站收录,影楼做网站目录 一、主要角色 二、类型划分 三、静态代理 示例 缺点 四、动态代理 JDK动态代理 示例 缺点 CGLib动态代理 导入依赖 示例 五、Spring AOP 代理模式是一种结构型设计模式,通过代理对象控制对目标对象的访问,可在不改变目标对象情况下增强…

目录

一、主要角色

二、类型划分

三、静态代理

示例

缺点

四、动态代理

JDK动态代理

示例

 缺点

CGLib动态代理

导入依赖

示例

五、Spring AOP


        代理模式是一种结构型设计模式,通过代理对象控制对目标对象的访问,可在不改变目标对象情况下增强其功能,隐藏实现细节。

一、主要角色

  • Subject(业务接口类):可以是抽象类或接口
  • RealSubject(业务实现类):具体的业务执行,即被代理的对象
  • Proxy(代理类):RealSubject的代理

二、类型划分

根据代理的创建时期,可分为静态代理和动态代理

  • 静态代理:由程序员创建或工具自动生成代理类源代码并编译,程序运行前代理类的字节码文件已经存在;
  • 动态代理:在程序运行时运用反射机制动态创建而成

为方便下面的讲解,我们先提前创建业务接口类和业务实现类

//业务接口类
public interface HouseSubject {void rentHouse();
}
//业务实现类(被代理类)
public class RealHouseSubject implements HouseSubject {@Overridepublic void rentHouse() {System.out.println("我是房东,我出租房子");}
}

三、静态代理

示例
//代理类
public class HouseProxy implements HouseSubject{//中介出售房子前要先有房东的授权private HouseSubject houseSubject;public HouseProxy(HouseSubject houseSubject) {this.houseSubject = houseSubject;}@Overridepublic void rentHouse() {System.out.println("我是中介,我开始代理房东出租房子");houseSubject.rentHouse();System.out.println("我是中介,代理结束");}
}

使用代理类执行

public class Main {public static void main(String[] args) {//创建代理对象HouseSubject subject=new HouseProxy(new RealHouseSubject());subject.rentHouse();}
}

缺点
  • 为每个被代理类编写代理类,代码冗余,随着业务的发展,类数量膨胀,项目管理难度增大
  • 被代理类接口变化时,所有相关代理类都需修改,易出错,可维护性差
  • 只能服务特定被代理类,难以应对新类和多变的额外逻辑需求,缺乏灵活性

四、动态代理

JDK动态代理
示例

自定义JDKInvocationHandler 并重写invoke(),在invoke()中会调用目标方法,并自定义一些处理逻辑

import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;//实现 InvocationHandler接口可以被代理对象的方法进行功能增强
@Slf4j
public class JDKInvocationHandler implements InvocationHandler {//目标类private Object target;public JDKInvocationHandler(Object target) {this.target = target;}/*** 调用目标方法,并对方法进行增强* @param proxy 代理对象* @param method 代理对象需要实现的方法* @param args method方法所对应的参数*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {log.info("JDK动态代理开始");//调用目标函数Object result=method.invoke(target,args);log.info("JDK动态代理结束");return null;}
}

创建代理对象,执行逻辑 

import java.lang.reflect.Proxy;public class Main {public static void main(String[] args) {RealHouseSubject target=new RealHouseSubject();//通过被代理类、被代理类实现的接口、方法调用处理器来创建一个代理类/***  ClassLoader loader 类加载器,用于加载代理对象*  Class<?>[] interfaces 被代理类实现的一些接口(jdk只能代理实现了接口的类)*  java.lang.reflect.InvocationHandler h 实现了InvocationHandler接口的对象*/HouseSubject proxy=(HouseSubject) Proxy.newProxyInstance(target.getClass().getClassLoader(),new Class[]{HouseSubject.class},new JDKInvocationHandler(target));//使用代理类proxy.rentHouse();}
}

 缺点

只能代理实现了接口的类,不能代理普通类

CGLib动态代理

导入依赖
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
示例
import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;@Slf4j
public class CGLibMethodInterceptor implements MethodInterceptor {private Object target;public CGLibMethodInterceptor(Object target) {this.target = target;}/**** @param o 被代理的对象* @param method 目标方法* @param objects 方法入参* @param methodProxy 用于调用原始方法* @return* @throws Throwable*/@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//代理增强内容System.out.println("CGLib代理开始");//通过反射调用被代理的方法Object retVal=methodProxy.invoke(target,objects);System.out.println("CGLib代理结束");return retVal;}
}
import net.sf.cglib.proxy.Enhancer;public class Main {public static void main(String[] args) {HouseSubject target=new RealHouseSubject();HouseSubject proxy= (HouseSubject)Enhancer.create(target.getClass(),new CGLibMethodInterceptor(target));proxy.rentHouse();}
}

五、Spring AOP

Spring AOP是基于动态代理实现的,动态代理有JDK和CGLIB两种方式,运行时使用哪种方式与项目配置和代理的对象有关。

proxy-target-class="false"情况下,若代理对象实现接口,默认使用JDK动态代理;若未实现接口,则会用CGLIB动态代理。当然,即便对象实现接口,也能通过xml配置proxy-target-class="true"或在配置类上使用注解@EnableAspectJAutoProxy(proxyTargetClass = true) 强制使用CGLIB动态代理。

Spring Boot 2.X开始默认使用CGLIB代理,也就是proxy-target-class="true"。

二者各有优劣,需依项目实际情况抉择。JDK动态代理优势在于基于Java原生支持,无需额外依赖,性能较好,适用于对性能要求高且目标对象有接口的场景;但是只能代理实现了接口的对象。

CGLIB动态代理优势在于能代理无接口的普通类,功能更强大、灵活性更高;但是需额外注入依赖,且通过继承创建代理,若类被final修饰则无法代理,生成代理对象的性能开销相对较大。

http://www.dtcms.com/wzjs/425903.html

相关文章:

  • 临颍网站建设关键词搜索优化外包
  • h5美食制作网站模板下载怎么做公众号
  • 做淘宝主要看哪些网站有哪些国际羽联最新排名
  • 做营销的网站建设百度账号快速注册
  • 单位网站建设的优势网站测试报告
  • 网站备案必须去做公安备案吗推广营销网络
  • wordpress api小程序百度首页排名优化哪家专业
  • wap 手机网站建设肇庆百度快照优化
  • 潍坊网站建设公司电话win7优化
  • 网站建设小组泰安做网站公司
  • 前端什么证书含金量高如何做网站优化
  • 网站怎么做二级域名情感营销的十大案例
  • 网站建设的平台网络链接推广
  • 用腾讯云做网站的好处深圳网络营销策划公司
  • 小说网站怎么做权重想做网络推广如何去做
  • 没有自己的境外网站怎么做谷歌推广seo公司培训课程
  • 网站建设费用预算明细seo技术培训学校
  • 绍兴市住房与城乡建设厅网站sem推广优化
  • 海口疫情seo根据什么具体优化
  • 手机网站设计制作服务台湾搜索引擎
  • 泰安可以做网站的公司百度怎么注册自己的店铺
  • 模板网站也需要服务器吗广州番禺最新发布
  • 南京江北新区房价2022最新价格系统优化软件十大排名
  • 电脑做任务赚钱网站百度官网登录入口手机版
  • 房子设计图软件app免费南昌百度seo
  • 买实体服务器做网站建网站怎么赚钱
  • 葫芦岛建设厅网站jsurl中文转码
  • app 移动网站建设代运营一家店铺多少钱
  • 关键词推广优化seo品牌优化整站优化
  • 鞍山网站制作做网站的公司