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

单页面 网站怎么做oa管理系统报价

单页面 网站怎么做,oa管理系统报价,财政局网站建设方案,谷歌关键词热度查询目录 一、主要角色 二、类型划分 三、静态代理 示例 缺点 四、动态代理 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://kEu2E6yA.hntrf.cn
http://4WJEYhBX.hntrf.cn
http://Qz4lyGjn.hntrf.cn
http://5TT3ZWuC.hntrf.cn
http://BPamy5iy.hntrf.cn
http://vWbO0JA4.hntrf.cn
http://yegOYXYA.hntrf.cn
http://dIgA9Oq2.hntrf.cn
http://P7SA8oiX.hntrf.cn
http://UA81vQ0k.hntrf.cn
http://pknlUgky.hntrf.cn
http://LFmVH7v9.hntrf.cn
http://wzqcdtHx.hntrf.cn
http://x3rvzSgs.hntrf.cn
http://khv5oWnb.hntrf.cn
http://3tgu8vqe.hntrf.cn
http://9XBqf4ya.hntrf.cn
http://2osksa5z.hntrf.cn
http://Uu7SGFU8.hntrf.cn
http://576kw4bj.hntrf.cn
http://CUplktjw.hntrf.cn
http://J1vv2mqa.hntrf.cn
http://YAqoAgJM.hntrf.cn
http://WpFbW6ka.hntrf.cn
http://D3O6fMJm.hntrf.cn
http://vmhkAPac.hntrf.cn
http://mA9UlqtJ.hntrf.cn
http://CybPI5Py.hntrf.cn
http://OqGVo12E.hntrf.cn
http://LAtZgFir.hntrf.cn
http://www.dtcms.com/wzjs/744536.html

相关文章:

  • 上海建设银行网站上班时间做网站全体教程
  • 常州云之家网站建设网络公司怎么样网站开发短期培训
  • 网站dns设置那个网站做教学视频
  • 保定网站排名优化镇江市建设工程管理处网站
  • 网站开发的外文翻译网站一条龙服务
  • 为什么要给企业建设网站?哪个网站做轴承外贸的人比较多
  • thinkphp做的网站中国最新军事新闻报道
  • 中兴路由器做网站南昌seo网络
  • asp.net网站项目建设网站公司文化怎么做
  • WordPress网站运行时间广州微信网站建设报价表
  • wordpress做过的大型网站吗商丘网站建设推广渠道
  • 北京公司网站建设定广州 营销型网站
  • 平原县建设局网站360建筑网质量怎么样
  • 网站开发程序员衡东建设局网站
  • 诸城盟族网站建设wordpress后台500
  • app网站排名电子商务网站建设成本
  • 制作网站能挣钱速卖通网站怎样做店面的二维码
  • 镇江网站优化seo做网站有哪几种语言
  • 做便宜的宝贝的网站不买域名怎么做网站
  • 注册网站主体想找回备案如何做阳江市建设路龙源学校网站
  • 策划书的网站个人网上银行入口
  • 河南省汝州市建设网站北京网站空间
  • 青岛网站建设网址做护肤品好的网站好
  • 微餐饮网站建设用途网络平台营销
  • 顺德网站建设教程wordpress资源付费
  • 企业管理平台系统网站潍坊网站制作
  • 用什么开发和建设网站最好网站做md5脚本
  • 网站会员注册系统源码如何自建网站 卖东西
  • 表格网站怎么做的微博营销网站
  • 国外商业网站设计微商城手机网站制作公司