代理模式

【java设计模式】之 代理(Proxy)模式(下)

a 夏天 提交于 2019-12-09 15:37:57
接上一篇代理(Proxy)模式,看下proxy内部到底做了什么处理。通过上篇的代码debug,如图 p 发现这里调用proxy发现如下图中的$Proxy0和$Proxy1代理类,如何来的呢?先回顾一些知识: 类的完整生命周期如图: 一般类的完整生命周期从源文件开始,然后通过javac编译成字节码文件,然后通过类加载机制在元空间(1.7之前为方法区)生成class对象,然后new出实例化对象在堆中,之后通过可达性分析判断类是否还在被引用,没有引用在被垃圾回收GC回收。完整的生命周期。为啥在动态代理中谈到这个类的生命周期, 其实所谓的$Proxy0和$Proxy1变量的生成就是跳过了源文件的编译直接从 内存中生成的字节码。 接下来我们去看看源码,里面到底是如何在内存中生成字节码文件的。首先看到之前的getProxyInstance()方法: 进入看看源码: public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { Objects.requireNonNull(h); final Class<?>[] intfs = interfaces.clone(); final

springMVC学习(代理模式)

社会主义新天地 提交于 2019-12-09 02:29:32
今天学习了,spring中的cglib代理实现,在正式开始学习cglib代理之前,我们先来学习自定义的代理,以及jdk为我们提供的代理模式。那么什么是代理模式,说的直白一点,就是用一个代理来实现我对具体对象的访问,或者操作,比如我们学习android开发的时候需要更新sdk,可是google的android开发官方网站是访问不到的(其实百度浏览器是可以翻墙的),这时候我们就需要翻墙了,而我们翻墙所用到的网络就可以称之为一个代理服务器,通过该代理,我们实现具体网站的访问,是不是很好理解呢。我们先来看看没有使用代理的例子: 我们这个例子以添加用户举例: 首先我新建一个接口,用来定义添加用户操作的行为: public interface UserDao { public void add(); } 然后新建一个实现类UserDaoImpl.java,在进行添加用户之前需要开启事物,添加完成之后,需要关闭事物。如下: public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("开启事务....."); System.out.println("执行了用户新增....."); System.out.println("执提交事务....."); } }

Spring AOP 最热门面试题及答案

社会主义新天地 提交于 2019-12-09 02:00:00
译者的话 之前去京东面试,被问到 AOP 相关的问题,之前一直没有系统地学习相关的知识,答得不是很好。趁着假期,找了一下相关的资料,CSDN上有很多不错的文章,看了之后对 AOP 有比较好的理解了。然后 Google 了一下 AOP 相关面试题(AOP interview),搜出来的第一条结果是一个叫 HowToDoInJava 的网站上的一篇文章 Top Spring AOP Interview Questions with Answers 。 看了一下,实话说,写得并不是很简单易懂,只是介绍性的文章而已。但是通篇看下来,基本的知识点也都覆盖到了。文章不是很长,所以为了加深印象,顺便把它翻译出来,以供大家参考。 Spring AOP 最热门面试题及答案 看完 Spring 核心面试题之后 ,让我们来看一下 Spring AOP 面试题,这个你可能会在下一次技术面试的时候遇到。同样的,请尽管提出一些这个帖子相关的新的问题来,我会把它们包含进来,以让更多的读者受益。 内容大纲: 描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介(Introduction

java动态代理

浪子不回头ぞ 提交于 2019-12-09 01:13:28
   引言   Java动态代理是代理模式的一种,代理模式就是:为另一个对象提供一个替身或占位符一控制对这个对象的访问。举个例子,明星都有一个经济人,一般各种商业活动,都会先找到经济人进行洽谈,洽谈成功,才会给明星安排上活动,经纪人就是明星的代理。   在java.lang.reflect包中实现了对代理的支持,利用这个包,可以在运行时动态的创建一个代理类。通过实现一个或多个接口,并将方法的调用转发到你所指定的类。   看下java动态代理的类图:   Proxy类是java根据Subject动态创建的,我们干预不了这个类,所以我们不能在这个类中,去做什么。我们需要一个方式来告诉Proxy我们要做什么。所以我们需要一个InvocationHandler来响应Proxy类的方法调用。可以理解为Proxy收到方法调用后,会将通过InvocationHandler来做实际的工作(其实InvocationHandler也是委托RealSubject来做的)。   简单demo代码  /** * 接口 */ public interface Subject { void doSomething(); } /** * 接口实现类 */ public class RealSubject implements Subject{ public void doSomething(){ System

案例分析:设计模式与代码的结构特性

微笑、不失礼 提交于 2019-12-08 21:37:30
1、什么是设计模式(Design Patterns): 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。 2、最近用到以及上课涉及到的设计模式有工厂模式、抽象工厂模式、代理模式、建造者模式    拿最近学习的mybatis框架中的应用举例 import com.itheima.dao.UserDao; import com.itheima.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session

MySQL大表优化方案

坚强是说给别人听的谎言 提交于 2019-12-08 18:12:14
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在 千万级 以下,字符串为主的表在 五百万 以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用 TINYINT 、 SMALLINT 、 MEDIUM_INT 作为整数类型而非 INT ,如果非负则加上 UNSIGNED VARCHAR 的长度只分配真正需要的空间 使用枚举或整数代替字符串类型 尽量使用 TIMESTAMP 而非 DATETIME , 单表不要有太多字段,建议在20以内 避免使用NULL字段,很难查询优化且占用额外索引空间 用整型来存IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段 字符字段只建前缀索引 字符字段最好不要做主键 不用外键,由程序保证约束 尽量不用 UNIQUE

设计模式 - 代理模式

心不动则不痛 提交于 2019-12-08 15:22:31
装饰模式 含义:为其他对象提供一种代理以控制对这个对象的访问。也可以说,一个类代表另一个类的功能 实现过程: 理论性:创建 被代理类 及 代理类 , 客户端直接与代理类对象进行交互 ,间接实现了被代理类功能 比喻:上班狗没空肝游戏,需要找游戏代练,代练替我们肝了日常活动,即代替我们实现了打游戏这一操作 优缺点: 优点: 代码结构清晰 高扩展性(代理类既把被代理类实现,又可扩展自身功能) 智能化(动态代理) 缺点: 由于在客户端和真实主题(被代理对象)之间增加了代理对象,某些类型的代理模式可能会造成请求的处理速度变慢 介于两者中间的代理类,会造成额外的开销 适用场景: 远程代理:为了一个对象在不同的地址空间提供局部代表,进而隐藏对象存在于不同地址空间的事实 虚拟代理:根据需要创建开销很大的对象 安全代理:用于控制真实对象的访问权限 智能引用代理:指当调用真实的对象时,代理处理另外一些事 防火墙代理 同步化代理 Cache代理 项目示例: 代理模式实现玩家找代练肝游戏的情景: // 玩家与代练都会打游戏(公共接口): // ----------------------------- interface IPlayGame { void KillEnemy(); void KillBoss(); void MissionFinished(); } // 打的游戏(代理直接接触对象): /

客户端GUI测试技术和自动化测试架构设计简谈

北城余情 提交于 2019-12-08 01:25:47
客户端自动化特点 客户端的自动化,通常做过的人都不是很愿意深入讨论。因为除了功能和逻辑之外,不得不面对各种界面变化,各种和环境交互,各种兼容问题以及想不到灰色地带,就算这样,也找不到太多有效的bug。然而即便如此,客户端的自动化必须去做,尤其是GUI的。它的自动化特点是: 复杂 成本高 不容易发现问题 技术要求高 架构很难通用 下面,从一些基本的东西开始一点点的讨论客户端GUI测试的一些问题和处理办法,以及自动化架构设计的一些思路。事实上就像上面说的,GUI的测试并不是为了发现bug,而是回归的一种方式,作为保证而已——它过了不能说明质量多么好,但是不过,质量肯定不达标。即使在微软内部,客户端的GUI一样不是个受欢迎的家伙,通常用来做BVT的测试(或一些重要性回归,冒烟等)。 客户端自动化简述 这里并不花过多的笔墨介绍什么是客户端,或者如何分类的种种——这些东西教材和网上的东西一坨一坨很多很多,这里可能“漫谈”的,是实际工作中,客户端和GUI自动化中可能遇到的一些底层技术,基本上原理,架构设计方法以及一些项目存在困惑,这些方面的一些处理的方法。 最早的自动化 我个人认为所谓的计算机行业的自动化,是一直跟着这个行业的发展在走,比如下面的这些: 老式计算机——CPU计算: 最早自动解决手工分配穿孔的卡片问题 内存分配任务调度:操作系统的核心就是内存和任务的自动管理 系统配置Loader

【转载】设计模式也可以这么简单

烂漫一生 提交于 2019-12-07 18:54:29
一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的😂😂😂,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four ( GoF ) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 有一些重要的设计原则在开篇和大家分享下,这些原则将贯通全文: 面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧。 职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。 对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不能说改就改;对扩展开放就比较好理解了,也就是说在我们写好的代码基础上,很容易实现扩展。 创建型模式比较简单,但是会比较没有意思,结构型和行为型比较有意思。 创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类

MySQL大表优化方案

☆樱花仙子☆ 提交于 2019-12-07 15:07:34
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在 千万级 以下,字符串为主的表在 五百万 以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用 TINYINT 、 SMALLINT 、 MEDIUM_INT 作为整数类型而非 INT ,如果非负则加上 UNSIGNED VARCHAR 的长度只分配真正需要的空间 使用枚举或整数代替字符串类型 尽量使用 TIMESTAMP 而非 DATETIME , 单表不要有太多字段,建议在20以内 避免使用NULL字段,很难查询优化且占用额外索引空间 用整型来存IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段 字符字段只建前缀索引 字符字段最好不要做主键 不用外键,由程序保证约束 尽量不用 UNIQUE