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

域名购买后如何建设网站备案期间网站能用吗

域名购买后如何建设网站,备案期间网站能用吗,公司怎么样做网站,溧阳网站建设中心代理模式 代理模式是指给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问 代理模式是一种结构型设计模式 背景 如果不采用代理,对一个类的多个方法进行监控时,重复的代码总是重复出现,不但破坏了原方法,…

代理模式

代理模式是指给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问

代理模式是一种结构型设计模式

背景

如果不采用代理,对一个类的多个方法进行监控时,重复的代码总是重复出现,不但破坏了原方法,如果要实现多个监控,将会对代码造成大量冗余。同时,还导致业务代码,与非业务的监控代码掺杂在一起,不利于扩展和维护。代理类在无限制膨胀,就需要无限的修改业务代码。

而采用代理后,原方法不需要做任何改动,操作的是原方法的代理对象,而原方法不用做任何修改,就实现了被监控。

结构

代理模式的结构比较简单,其核心是代理类,为了让客户端能够一致性地对待真实对象(RealSubject)和代理对象(Proxy),引入了抽象层(Subject)

在这里插入图片描述

代理模式角色:

  • Subject(抽象主题角色):定义 代理类和真实主题的 公共对外方法,也是代理类代理真实主题的方法
  • RealSubject(真实主题角色):真正实现业务逻辑的类
  • Proxy(代理主题角色):用来代理和封装真实主题

分类

按使用场景

代理模式按照职责(使用场景)来分类,至少可以分为以下几类:

  • 远程代理
  • 虚拟代理
  • Copy-on-Write 代理
  • 保护(Protect or Access)代理
  • Cache代理
  • 防火墙(Firewall)代理
  • 同步化(Synchronization)代理
  • 智能引用(Smart Reference)代理

按字节码的创建时机

如果根据字节码的创建时机来分类,可以分为 静态代理和动态代理

静态代理

所谓静态是指在程序运行前就已经存在代理类的字节码文件,代理类和真实主题角色的关系在运行前就已经确定

优点:

  • 实现简单
  • 没有侵入原代码
  • 可以很好的保护实际对象的业务逻辑对外暴露,从而提高安全性

代理对象和实际对象都继承了同一个接口,在代理对象中指向的是实际对象的实例,即对外暴露的是代理对象而真正调用的是 Real Object

缺点:

  • 当需要代理多个类的时候,由于代理对象要实现与目标对象一致的接口,有两种方式:
    • 只维护一个代理类,由这个代理类实现多个接口,但是这样就导致代理类过于庞大
    • 新建多个代理类,每个目标对象对应一个代理类,但是这样会产生过多的代理类
  • 当接口需要增加、删除、修改方法的时候,目标对象与代理类都要同时修改,不易维护

实例:

通过静态代理对 UserServiceImpl 进行功能增强,在调用selectupdate之前记录一些日志。

1、编写一个接口 UserService ,以及该接口的一个实现类 UserServiceImpl

public interface UserService {public void select();   public void update();
}public class UserServiceImpl implements UserService {  public void select() {  System.out.println("查询 selectById");}public void update() {System.out.println("更新 update");}
}

2、写一个代理类 UserServiceProxy,代理类需要实现 UserService

public class UserServiceProxy implements UserService {private UserService target; // 被代理的对象public UserServiceProxy(UserService target) {this.target = target;}public void select() {before();target.select();    // 这里才实际调用真实主题角色的方法after();}public void update() {before();target.update();    // 这里才实际调用真实主题角色的方法after();}private void before() {     // 在执行方法之前执行System.out.println(String.format("log start time [%s] ", new Date()));}private void after() {      // 在执行方法之后执行System.out.println(String.format("log end time [%s] ", new Date()));}
}

3、测试

public class Client {public static void main(String[] args) {UserService userServiceImpl = new UserServiceImpl();UserService proxy = new UserServiceProxy(userServiceImpl);proxy.select();proxy.update();}
}
动态代理

动态代理的源码是在程序运行期间由JVM根据反射等机制动态的生成,在运行前并不存在代理类的字节码文件

让代理类动态的生成(动态代理),可以避免静态代理复杂环境下复杂度高及不易维护的缺点

动态代理的优势就是实现无侵入式的代码扩展,实现AOP编程,这是静态代理无法实现的

实现动态代理的两种常见方式:

  • JDK动态代理:通过实现接口的方式
  • CGLIB动态代理:通过继承类的方式

Java 动态代理使用 Java 原生的反射 API 进行操作(运行期),在生成类上比较高效;而CGLIB 相比于 JDK 动态代理更加强大,CGLIB使用ASM框架直接对字节码进行操作(编译期),在类的执行过程中比较高效。

CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,JDK方式要更合适

JDK动态代理

Java标准库提供的一种动态代理(Dynamic Proxy)的机制,允许在运行期动态创建某个interface的实例。

jdk动态代理之所以只能代理接口是因为代理类本身已经继承了Proxy,而java是不允许多重继承的,但是允许实现多个接口。

由于 JDK 动态代理限制了只能基于接口设计,而对于没有接口的情况,JDK动态代理方式无法解决;

实现方式:

只需要实现 InvocationHandler 接口,重写 invoke 方法便可以完成代理的实现,jdk的代理是利用反射生成代理类 Proxyxx.class 代理类字节码,并生成对象。

优点

  • 解决了静态代理中冗余的代理实现类问题。

缺点

  • JDK 动态代理是基于接口设计实现的,如果没有接口,会抛异常。

实例:

通过静态代理对 UserServiceImpl 进行功能增强,在调用selectupdate之前记录一些日志。

1、编写一个接口 UserService ,以及该接口的一个实现类 UserServiceImpl

public interface UserService {public void select();   public void update();
}public class UserServiceImpl implements UserService {  public void select() {  System.out.println("查询 selectById");}public void update() {System.out.println("更新 update");}
}

2、写一个代理类 UserServiceProxy,代理类需要实现 UserService

public class UserServiceProxy {public static Object getObject(final UserService target){Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(String.format("log start time [%s] ", new Date()));method.invoke(target, args);System.out.println(String.format("log end time [%s] ", new Date()));return null;}});return proxyInstance;}
}

3、测试

public class Client {public static void main(String[] args) {UserService userServiceImpl = new UserServiceImpl();UserService proxy =(UserService) UserServiceProxy.getObject(userServiceImpl);proxy.select();proxy.update();}
}
CGLIB 代理

CGLib 采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,来完成动态代理的实现。

由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

实现方式:

实现 MethodInterceptor 接口,重写 intercept 方法,通过 Enhancer 类的回调方法来实现。

优点

  • 没有接口也能实现动态代理,而且采用字节码增强技术,性能也不错。

缺点

  • 技术实现相对难理解

实例:

通过静态代理对 UserServiceImpl 进行功能增强,在调用selectupdate之前记录一些日志。

1、编写一个接口 UserService ,以及该接口的一个实现类 UserServiceImpl

public interface UserService {public void select();   public void update();
}public class UserServiceImpl implements UserService {  public void select() {  System.out.println("查询 selectById");}public void update() {System.out.println("更新 update");}
}

2、写一个代理类 UserServiceProxy,代理类需要实现 UserService

public class UserServiceProxy {public static Object getObject(final UserService target){Object proxyObj = Enhancer.create(obj.getClass(), new MethodInterceptor() {public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(String.format("log start time [%s] ", new Date()));method.invoke(target, objects);System.out.println(String.format("log end time [%s] ", new Date()));return null;}});return proxyObj;}
}

3、测试

public class Client {public static void main(String[] args) {UserService userServiceImpl = new UserServiceImpl();UserService proxy =(UserService) UserServiceProxy.getObject(userServiceImpl);proxy.select();proxy.update();}
}

参考

Java 动态代理详解 - 掘金 (juejin.cn)


文章转载自:

http://j2H2t9En.Lpzqx.cn
http://TQC7svCn.Lpzqx.cn
http://VWGji2Pd.Lpzqx.cn
http://3ZNMLHRx.Lpzqx.cn
http://bzX0msCa.Lpzqx.cn
http://6jpaHiLN.Lpzqx.cn
http://ocx3g55K.Lpzqx.cn
http://kVERzXw2.Lpzqx.cn
http://6pm59ARA.Lpzqx.cn
http://3pdWJUiQ.Lpzqx.cn
http://EXpYZdDj.Lpzqx.cn
http://9tbTfWom.Lpzqx.cn
http://TpQ92vma.Lpzqx.cn
http://aKXZJ13s.Lpzqx.cn
http://LlBoLeMO.Lpzqx.cn
http://XBojhc2b.Lpzqx.cn
http://EK3FMSC5.Lpzqx.cn
http://HZqLUPkt.Lpzqx.cn
http://xDh3p0qF.Lpzqx.cn
http://3FrD1BSy.Lpzqx.cn
http://XtVGuvfQ.Lpzqx.cn
http://TYtIpsqw.Lpzqx.cn
http://B8BaYKtH.Lpzqx.cn
http://lYSBpi6o.Lpzqx.cn
http://5nkqJIkI.Lpzqx.cn
http://j63Fvo3d.Lpzqx.cn
http://noVMFcNc.Lpzqx.cn
http://mPceGr3R.Lpzqx.cn
http://68muFu9H.Lpzqx.cn
http://ItLjPKd5.Lpzqx.cn
http://www.dtcms.com/wzjs/771001.html

相关文章:

  • 建设银行人力资源招聘网站怎么给自己的网站推广
  • 做网站竞争者的优势wordpress 表格主题
  • 郑州网站排名推广制作网站怎么制作
  • 医院网站方案研发app公司
  • 做电影网站心得东莞官方网站 优帮云
  • 公司网站域名主机龙江人社使用方法
  • 东莞做微网站厦门网页设计公司价格
  • 宁波网站制作好公司中国建筑门户网
  • 微网站开发 课程标准用word怎么做首页网站
  • 婚纱网站设计目标网站分站程序
  • 深圳网站定制价格表下列关于网站开发中网站上传
  • 广州网站建设定制设计葫芦岛做网站公司
  • 网站的后台地址开发板用什么语言编程
  • 广州网站建设gzqiyi做二手车网站需要什么手续费
  • 管理网站建设公司好吗科技画
  • 智能建站免费关于做美食的小视频网站
  • xml网站地图制作网站界面的版式架构
  • 做网站需服务器吗桂平seo关键词优化
  • iis配置网站无法访问wordpress文章时间
  • 响应式的学校网站优秀的电子商务网站
  • 无锡网站开发电影网站加盟可以做么
  • 内蒙古建设厅建筑网站图片做多的网站是哪个
  • 衡阳网站建设衡阳千度网络个人可以做几个网站
  • 网站建设状态栏百度浏览器极速版
  • 深圳专业做网站哪家好58网站怎么样做效果会更好
  • 景安网站备案 不去拍照企业做app好还是网站好
  • 深圳商业网站建设模板菲律宾有做网站的吗
  • 山东聊城建设学校网站东莞企业网站建设公司
  • 网站底部公司是什么样的深圳市保障性住房官网
  • 网站制作机构宁德市古田县