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

网站开发心得体会遂溪 网站

网站开发心得体会,遂溪 网站,下载大连建设网官方网站,四平市住房和城乡建设部网站1. 代理模式介绍代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常在客户端和目标对象之间起到中介作用,能够在不改变目标对象的前提下增加额外的功能操作,比如延迟初始化、访问控制、日志记录等…

1. 代理模式介绍

代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常在客户端和目标对象之间起到中介作用,能够在不改变目标对象的前提下增加额外的功能操作,比如延迟初始化、访问控制、日志记录等。

通俗来说,代理模式就像是你在现实生活中使用中介服务一样。比如租房时,你可能不会直接联系房东,而是通过房屋中介来完成租赁过程。中介(代理)会帮你处理一些细节问题,如看房、谈判价格等,最终让你顺利租到房子。

代理模式有四种常见实现方式:

实现方式核心机制依赖要求限制条件性能灵活性代码侵入性
基于接口的静态代理手动创建代理类,实现相同接口依赖接口必须实现接口★★★★☆ (高)★★☆☆☆ (低)
基于继承的静态代理代理类继承目标类并重写方法不需要接口不能代理final类/方法★★★★☆ (高)★★☆☆☆ (低)
基于JDK的动态代理Proxy+InvocationHandler反射生成字节码必须实现接口JDK原生支持,要求有接口★★★☆☆ (中等)★★★★★ (高)
基于CGLIB的动态代理继承目标类+MethodInterceptor修改字节码不需要接口不能代理final类/方法;需第三方库★★★★☆ (较高)★★★★★ (高)

2.代码演示

2.1 基于接口的静态代理

实现原理

  • 代理类与目标类实现相同接口
  • 代理类持有目标对象的引用
  • 手动在接口方法中添加增强逻辑

示例场景

//接口
public interface Subject {void request();
}//被代理的目标类
public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Handling request.");}
}//“基于接口”的静态代理类
public class ProxySubject implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}System.out.println("ProxySubject: Pre-processing before handling request.");realSubject.request();System.out.println("ProxySubject: Post-processing after handling request.");}
}

使用方式:

public class Demo {public static void main(String[] args) {System.out.println("Using RealSubject directly:");Subject realSubject = new RealSubject();realSubject.request();System.out.println("\nUsing ProxySubject:");Subject proxySubject = new ProxySubject();proxySubject.request();}
}

2.2 基于继承的静态代理

实现原理

  • 代理类继承目标类
  • 重写方法并添加增强逻辑
  • 通过super调用父类方法

示例场景

//被代理的目标类
public class RealSubject {public void request() {System.out.println("RealSubject: Handling request.");}
}//“基于继承”的静态代理方式
public class ProxySubjectByInheritance extends RealSubject {@Overridepublic void request() {System.out.println("ProxySubjectByInheritance: Pre-processing before handling request.");super.request();System.out.println("ProxySubjectByInheritance: Post-processing after handling request.");}
}

使用方式:

public class Demo {public static void main(String[] args) {System.out.println("Using RealSubject directly:");Subject realSubject = new RealSubject();realSubject.request();System.out.println("\nUsing ProxySubjectByInheritance:");Subject proxySubjectByInheritance = new ProxySubjectByInheritance();proxySubjectByInheritance.request();}
}

2.3 基于JDK的动态代理

实现原理

  • 底层使用Java的反射机制
  • 运行时通过java.lang.reflect.Proxy.newProxyInstance()动态生成代理对象
  • 通过InvocationHandler统一处理所有方法调用

示例场景

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** “基于JDK”的动态代理(可以看作是“基于接口”的动态代理)* 要求: 代理的目标对象必须实现接口* 提供者: JDK,使用JDK官方的Proxy类创建代理对象* 代理类: 生成的代理类和被代理类基于相同的接口,只能使用用接口里的public方法**/
public class JdkProxySubject implements InvocationHandler {private Object target;/*** 创建代理对象的方法** @param target 被代理的原始对象; 被代理对象的类必须实现接口* @return 代理对象; 与被代理对象实现相同接口*/public Object getInstance(Object target) {this.target = target;// 创建对象的代理对象// 参数1:类加载器; 参数2:被代理对象的接口; 参数3:代理类return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}/*** 拦截所有目标类的方法** @param proxy  目标类对象* @param method 目标类的方法* @param args   目标类的方法参数* @return 目标类方法的返回值* @throws Throwable 目标类方法抛出的异常*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JdkProxySubject: Pre-processing before handling request.");Object result = method.invoke(target, args);System.out.println("JdkProxySubject: Post-processing after handling request.");return result;}
}

使用方式:

public class Demo {public static void main(String[] args) {System.out.println("Using RealSubject directly:");Subject realSubject = new RealSubject();realSubject.request();System.out.println("\nUsing JdkProxySubject:");JdkProxySubject jdkProxySubject = new JdkProxySubject();Subject realSubjectProxy = (Subject) jdkProxySubject.getInstance(new RealSubject());realSubjectProxy.request();}
}

2.4 基于CGLIB的动态代理

实现原理

  • 使用CGLIB库来生成代理类,这个库允许我们在运行时动态地创建目标类的子类
  • 采用方法拦截(MethodInterceptor)机制
  • 通过FastClass机制避免反射调用

示例场景

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;/*** “基于CGLB”的动态代理(可以看作“基于继承”的动态代理)* 提供者: 第三方 CGLib,使用CGLib的Enhancer类创建代理对象* 代理类: 生成的代理类是被代理类的子类,可以使用被代理类中的 public 和 protected 方法*/
public class CglibProxySubject implements MethodInterceptor {private Object target;/*** 使用CGLib创建动态代理对象** @param target 被代理的原始对象; 被代理对象不能用final修饰(final修饰后无法继承了)* @return 代理对象; 是被代理对象的子类*/public Object getInstance(Object target) {this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());enhancer.setCallback(this);return enhancer.create();}/*** 拦截所有目标类的方法** @param obj    目标类的实例* @param method 目标类的方法* @param args   目标类方法的参数* @param proxy  目标类方法的代理* @return 目标类方法的返回值* @throws Throwable 目标类方法抛出的异常*/@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("CglibProxySubject: Pre-processing before handling request.");Object result = proxy.invokeSuper(obj, args);System.out.println("CglibProxySubject: Post-processing after handling request.");return result;}
}

使用方式:

public class Demo {public static void main(String[] args) {System.out.println("Using RealSubject directly:");Subject realSubject = new RealSubject();realSubject.request();System.out.println("\nUsing CglibProxySubject:");CglibProxySubject cglibProxySubject = new CglibProxySubject();RealSubject realSubjectCglibProxy = (RealSubject) cglibProxySubject.getInstance(new RealSubject());realSubjectCglibProxy.request();}
}

3.四种代理模式比较

以下是四种代理模式的对比分析及使用场景总结:

代理方式优点缺点适用场景
基于接口的静态代理

1.结构清晰,易于理解和维护

2.性能最优(无反射开销),类型安全

1.需要为每个被代理类编写代理类,代码冗余

2.类方法变更需同步修改代理类

1.接口方法数量少且稳定

2.需要极致性能的场景(如高频调用)或者需要精确控制代理逻辑的场景

3.简单项目或教学演示

基于继承的静态代理1.可以代理没有接口的类

1.同样需要编写大量代码;

2.不能代理final类/方法

3.类方法变更需修改代理类

1.遗留系统改造(无接口的类)

2.需要代理第三方类库(拿不到三方类库的接口)

3.不涉及final修饰的类/方法

JDK动态代理

1.无需编写代理类(动态生成),自动适配所有接口方法,减少代码量;

2. 支持统一拦截逻辑

1.只能代理实现了接口的类;

2.反射调用性能略低

1.Spring AOP默认实现

2.需要代理接口多个方法的场景

3.代理逻辑复杂且需复用的系统(如日志/事务统一管理)

CGLIB动态代理

1.可以代理没有接口的类;

2.性能通常优于JDK动态代理,接近静态代理(FastClass机制)

1.不能代理final类或final方法;

2.需引入第三方库(如Spring-core已内置)

3.生成字节码可能增加内存开销

1.代理没有接口的类(Spring对无接口Bean的代理)

2.需要高性能代理的场景(如Hibernate延迟加载)

3.代理非final的第三方类库


文章转载自:

http://6e8oRKd3.bhpjc.cn
http://aJnprWno.bhpjc.cn
http://GuTqSZoA.bhpjc.cn
http://giWGteAk.bhpjc.cn
http://oAJgq6fB.bhpjc.cn
http://t6JcqHGm.bhpjc.cn
http://dyW08vFj.bhpjc.cn
http://f4hfnaJh.bhpjc.cn
http://EI12Q6U8.bhpjc.cn
http://0mcQ0CPD.bhpjc.cn
http://feBVy97j.bhpjc.cn
http://YrFeDjRB.bhpjc.cn
http://I30B8wQ1.bhpjc.cn
http://xDDRD7c5.bhpjc.cn
http://i63G894m.bhpjc.cn
http://tWn6ysoL.bhpjc.cn
http://U7sbT72y.bhpjc.cn
http://WxRZ3m30.bhpjc.cn
http://Jsz5QMWw.bhpjc.cn
http://1lmg9qOs.bhpjc.cn
http://IqpYeG7J.bhpjc.cn
http://ohMjTwLd.bhpjc.cn
http://KlPKKpnu.bhpjc.cn
http://3q6ulE3W.bhpjc.cn
http://9Q4LQyR8.bhpjc.cn
http://LTeWzuDF.bhpjc.cn
http://WbeeOsRE.bhpjc.cn
http://dhL4FuzP.bhpjc.cn
http://61eOMNGd.bhpjc.cn
http://M1fOFk8l.bhpjc.cn
http://www.dtcms.com/wzjs/715069.html

相关文章:

  • 网站备案在哪个网连云港公司企业网站建设
  • 网站首页网址应该有对应的域名h5游戏代理
  • 网站推广公司哪家好郑州怎么做网站排名
  • 做网站可以用别人的源码吗工商营业执照网上申报
  • 类似淘宝的购物网站 建设印刷下单网站开发
  • 网站微信建设运维经验平面设计接单的网站
  • ssh可以做wap网站么杭州室内设计设计公司前十排名
  • 南昌大学作风建设网站安徽六安网
  • 网站开发网络公司兼职成都紧急通知
  • 购物网站制作例子专业网站建设-好发信息网
  • 备案 多个网站wordpress的功能
  • 罗湖网站建设优化网络推广培训策划
  • 免费软件下载网站市场营销策划包括哪些内容
  • 椒江建设网站深圳创新创业大赛
  • 开封旅游网站建设方案策划书山东省服务外包网
  • 钓鱼网站到底怎么做河池市都安县建设局网站
  • 网站开发的主要工作步骤网站设计的思想
  • 被禁止访问网站怎么办有赞微商城下载
  • 公司网站制作一般多少钱做网站空间备案的职业
  • 好的h5制作网站模板技术支持 优府网络太原网站建设
  • 黄石企业做网站设计模板网站
  • 数字镭网站开发qq免费注册网站
  • 旅游网站模板免费建盏茶杯知识
  • 保养车哪个网站做的好出国看病网站开发
  • 做网站的公司怎么样网站首页页脚
  • 设计图纸网站教务管理系统学生登录入口
  • 国企网站建设会议纪要企业网站建设学习
  • 淘宝商家网站建设东营建网站
  • 专门做网站建设的游戏租号网站怎么建设
  • ps做的网站怎样在dw里打开定制网站制作公司