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

山东省专业群建设网站网站建设公司ejiew

山东省专业群建设网站,网站建设公司ejiew,建筑网名,app开发用什么工具导航#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、代理模式的基本介绍 2、静态代理 3、JDK动态代理 4、Cglib 代理 5、代理模式 的变体#xff08;应用场景#xff09; 1、…  导航  【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、代理模式的基本介绍 2、静态代理 3、JDK动态代理 4、Cglib 代理 5、代理模式 的变体应用场景 1、代理模式的基本介绍 代理模式为一个对象提供一个替身以控制对这个对象的访问。即通过代理对象访问目标对象 代理模式是结构型设计模式用于描述对象之间的组合关系。 好处可以在目标对象实现的基础上增强额外的功能操作即扩展目标对象的功能 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理时对目标对象进行安全控制 我们并不希望客户端直接调用目标对象而是通过代理对象对目标对象实现安全控制或增强功能。所以我们客户端直接依赖代理对象代理对象依赖目标对象 代理模式有不同的形式主要有三种静态代理、JDK动态代理、Cglib 代理 静态代理 目标对象与代理对象实现租同的接口或继承相同的父类在编译时生成代理对象。 目标对象实现代理接口代理对象实现并聚合代理接口重写方法编写增强后逻辑。 JDK动态代理 通过Java反射机制在运行时动态地在内存中生成代理对象。 目标对象需要实现代理接口。 目标对象实现代理接口代理工厂通过Proxy类的静态方法newProxyInstance()利用反射机制返回代理对象实例。   newProxyInstance()三个参数目标对象的类加载器、目标对象的接口、实现InvocationHandler接口并重写invoke()方法编写代理对象逻辑。 应用Spring AOP采用了动态代理的方式在运行时动态的创建代理对象来实现增强。 Cglib 代理 在内存中构建一个子类对象从而实现对目标对象功能扩展。目标对象不需要实现代理接口。底层是通过使用ASM框架转换字节码并生成新的类。 代理工厂类实现MethodInterceptor接口并重写intercept()方法编写代理逻辑通过cglib包的Enhancer类设置父类字节码文件和创建子类对象来返回代理对象实例。 ASM框架是一个强大的Java字节码操作框架可以让程序员通过代码生成和转换现有字节码来操作Java类。ASM可以直接生成字节码也可以通过访问现有字节码来修改它。 2、静态代理 静态代理在使里时需要定义接口或者父类目标对象与代理对象实现租同的接口或继承相同的父类。 实现方式目标对象实现代理接口代理对象实现并聚合代理接口重写方法编写增强后逻辑。 优缺点 优点在不修改目标对象的功能前提下能通过代理对象对目标功能扩展 缺点因为代理对象需要与目标对象实现一样的接口所以会有很多代理类。耦合性较高一旦接口增加方法目标对象与代理对象都要维护 案例 1定义一个接口ITeacherDao 2目标对象TeacherDao实现接口ITeacherDao 3使用静态代理方式就需要在代理对象TeacherDaoProxy中也实现ITeacherDao 4调用的时候通过调用代理对象的方法来调用目标对象 5特别提醒代理对象与目标对象要实现相同的接口然后通过调用相同的方法来调用目标对象的方法 UML 类图     核心代码 /*** 代理接口*/ public interface ITeacherDao {void teach(); //代理对象和原始对象重写这个方法 } /*** 目标对象即被代理对象。实现代理借口*/ public class TeacherDao implements ITeacherDao {Overridepublic void teach() {System.out.println(老师授课中...);} } /*** 代理对象。实现代理借口*/ public class TeacherDaoProxy implements ITeacherDao {private ITeacherDao iTeacherDao; //接口引用public TeacherDaoProxy(ITeacherDao iTeacherDao) {this.iTeacherDao iTeacherDao;}Overridepublic void teach() {System.out.println(准备授课...);iTeacherDao.teach();System.out.println(结束授课...);} } 客户端调用代理 //创建被代理对象 TeacherDao teacherDao new TeacherDao(); //创建代理对象聚合被代理对象 TeacherDaoProxy teacherDaoProxy new TeacherDaoProxy(teacherDao); //通过代理对象调用被代理对象的方法 teacherDaoProxy.teach(); 3、JDK动态代理 Java中的动态代理是一种机制它通过在程序运行时动态地生成代理对象并在代理对象上进行方法调用实现对目标对象方法的拦截与控制。动态代理是代理设计模式的一种实现方式与静态代理不同的是它不需要显示地编写代理类来代理被代理对象而是通过Java反射机制在运行时动态生成代理类和代理对象。  实现方法 目标对象实现代理接口代理工厂通过Proxy类的静态方法newProxyInstance()利用反射机制返回代理对象实例。   newProxyInstance()三个参数目标对象的类加载器、目标对象的接口、实现InvocationHandler接口并重写invoke()方法编写代理对象逻辑。 1代理对象不需要实现接口但是目标对象要实现接口否则不能用动态代理 2代理对象的生成是利用 JDK 的 APl动态的在内存中构建代理对象 3动态代理也叫做JDK 代理、接口代理 JDK提供了java.lang.reflect.Proxy类可以通过它创建基于接口的动态代理对象。使用Proxy类的newProxyInstance静态方法该方法需要接收三个参数 static Object newProxylnstance(ClassLoader loader, Class?[] interfaces, InvocationHandler h) 案例   核心代码 //代理接口和目标对象同上目标对象需要实现代理接口 // ITeacherDao与TeacherDao同上 /*** 代理工厂*/ public class TeacherFactory {/*** 目标对象*/private Object target;public TeacherFactory(Object target) {this.target target;}public Object newProxyInstance() { //1。ClassLoader loader : 指定当前目标对象使用的类加载器获取加载器的方法固定 //2Class?[] interfaces: 目标对象实现的接口类型使用泛型方法确认类型 //3。InvocationHandler h : 事情处理执行目标对象的方法时会触发事情处理器方法会把当前执行的目标对象方法作为参数传入return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(JDK代理授课开始...);Object returnVal method.invoke(target, args);System.out.println(JDK代理授课结束...);return returnVal;}});} } 创建代理对象 //创建目标对象 ITeacherDao target new TeacherDao(); //给目标对象创建代理对象可以转成 ITeacherDao ITeacherDao proxyInstance (ITeacherDao)new ProxyFactory(target).getProxyInstance(); // proxyInstanceclass com.sun.proxy.$Proxy0 内存中动态生成了代理对象 System.out.println(proxyInstance proxyInstance.getClass()); //通过代理对象调用目标对象的方法 proxyInstance.teach(); 其中几个参数 1ClassLoader loader指定当前目标对象使用的类加载器获取加载器的方法固定 2Class?[] interfaces目标对象实现的接口类型使用泛型方法确认类型 3InvocationHandler h事情处理执行目标对象的方法时触发事情处理器方法把当前执行的目标对象方法作为参数传入 4、Cglib 代理 Cglib 代理 静态 代理和 JDK 代理模式都要求目标对象是实现一个接口但是有时候目标对象只是一个单独的对象并没有实现任何的接口这个时候可使用目标对象子类来实现代理——这就是 Cglib 代理 Cglib 代理也叫作子类代理它是在内存中构建一个子类对象从而实现对目标对象功能扩展有些书也将 Cglib 代理归属到动态代理。 使用方法 代理工厂类实现MethodInterceptor接口并重写intercept()方法编写代理逻辑通过cglib包的Enhancer类设置父类字节码文件和创建子类对象来返回代理对象实例。 Cglib包 是一个强大的高性能的代码生成包它可以在运行期扩展 java 类与实现 java 接口。它广泛的被许多 AOP 的框架使用例如 Spring AOP实现方法拦截。 Cglib 包的底层是通过使用ASM框架来转换字节码并生成新的类 ASM框架 一个强大的Java字节码操作框架可以让程序员通过代码生成和转换现有字节码来操作Java类。ASM可以直接生成字节码也可以通过访问现有字节码来修改它。我们可以使用ASM来生成新的类、新的方法、字段、注解等。同时ASM还允许我们在运行时改变现有的Java类的字节码从而实现动态的Java类修改例如添加方法、添加字段等。 在 AOP 编程中如何选择代理模式 目标对象需要实现接口用 JDK 代理 目标对象不需要实现接口用 Cglib 代理 案例 1引入cglib的 jar 文件 2在内存中动态构建子类注意代理的类不能为final否则报错java.lang.IllegalArgumentException 3目标对象的方法如果为final/static那么就不会被拦截即不会执行目标对象额外的业务方法 uml图不再有代理接口   核心代码   /*** 被代理对象*/ public class TeacherDao {public String teach() {System.out.println(老师授课中...);return Good;} }/*** 代理工厂类实现MethodInterceptor 接口*/ public class ProxyFactory implements MethodInterceptor {/*** 目标对象*/private Object target;/*** 构造函数** param target*/public ProxyFactory(Object target) {this.target target;}/*** 返回代理对象实例。不是静态方法** return*/public Object getProxyInstance() {// 1、创建工具类Enhancer enhancer new Enhancer();// 2、设置父类enhancer.setSuperclass(target.getClass());// 3、设置回调函数enhancer.setCallback(this);// 4、创建子类对象即代理对象return enhancer.create();}Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(cglib代理开始...);Object retVal method.invoke(target, args);System.out.println(cglib代理结束...);return retVal;} }  调用代理 //创建目标对象 TeacherDao teacherDao new TeacherDao(); //通过代理工厂创建代理对象 TeacherDao proxyInstance (TeacherDao) new ProxyFactory(teacherDao).getProxyInstance(); //通过代理对象调用目标对象方法 String retVal proxyInstance.teach(); System.out.println(retVal retVal);   5、代理模式 的变体应用场景 几种常见的代 理模式介绍一几种变体 防火墙代理内网通过代理穿透防火墙实现对公网的访问缓存代理比如当请求图片文件等资源时先到缓存代理取如果取到资源则 ok如果取不到资源再到公网或者数据库取然后缓存远程代理远程对象的本地代表通过它可以把远程对象当本地对象来调用。远程代理通过网络和真正的远程对象沟通信息 同步代理主要使用在多线程编程中完成多线程间同步工作
http://www.hkea.cn/news/14293263/

相关文章:

  • 做虚拟货币交易网站一级A做爰片安全网站
  • 自己电脑做服务器网站吗pda智能巡检系统
  • 南京网站制作百家号商务网站建设与维护 课件
  • 奉化网站建设报价用c 实现网站开发
  • 英文网站标题字体科技公司网站制作模板
  • 甘肃省网站备案优化大师怎么强力卸载
  • 网站建设公司推广方式科技软件公司网站模板
  • 网站流量团队房地产客户管理系统有哪些
  • 网络服务的重要性网站优化营销
  • 网站域名收费吗域名购买推荐
  • 专注苏州网站优化热门页游排行榜前十名
  • 网站建设东莞海南网站优化公司
  • 计算机网站开发是那个语言如何还原wordpress
  • 备案的网站如何访问炫酷网站欣赏
  • 公司网站开发维护06628 网页制作与网站建设
  • 网站建设遇到问题解决方案站内免费推广
  • wordpress 中文版下载网站关键词优化哪家正规
  • 网站百度关键词排名软件wordpress 脚本慢
  • 我和你99谁做的网站163企业邮箱怎么开通注册账号
  • 人力资源网站建设方案目前主流搜索引擎是哪种
  • 品牌网站建设毛尖2租房网 wordpress
  • 怎么用lofter做网站餐饮营销方案
  • 单页网站 开元wordpress博客小工具标签
  • 织梦网站管理安装婚纱摄影网页制作
  • 网站推广营销的步骤wordpress 简单模板
  • 如何在百度建设企业网站天津个人网站备案查询
  • 2017国外优秀网站设计网站搜索功能怎样做
  • 黄石网站设计制作建门户网站哪家最好
  • wordpress英文站群舟山网络公司网站建设公司
  • 提高网站seowordpress怎么弄背景