cglib

面试必问系列之JDK动态代理

随声附和 提交于 2020-08-11 01:19:04
扫描文末二维码或者微信搜索公众号 小李不秃 ,即可关注微信公众号,获取到更多 Java 相关内容。 1. 带着问题去学习 面试中经常会问到关于 Spring 的代理方式有哪两种?大家异口同声的回答: JDK 动态代理和 CGLIB 动态代理。 这两种代理有什么区别呢?JDK 动态代理的类通过接口实现,CGLIB 动态代理是通过子类来实现的。 那 JDK 动态代理你了到底了解多少呢?有去看过代理对象的 class 文件么?下面两个关于 JDK 动态代理的问题你能回答上来么? 问题1:为什么 JDK 动态代理要基于接口实现?而不是基于继承来实现? 问题2:JDK 动态代理中,目标对象调用自己的另一个方法,会经过代理对象么 ? 小李带着大家更深入的了解一下 JDK 的动态代理。 2. JDK 动态代理的写法 JDK 动态代理需要这几部分内容:接口、实现类、代理对象。 代理对象需要继承 InvocationHandler ,代理类调用方法时会调用 InvocationHandler 的 invoke 方法。 Proxy 是所有代理类的父类,它提供了一个静态方法 newProxyInstance 动态创建代理对象。 public interface IBuyService { void buyItem ( int userId) ; void refund ( int nums) ; }

Spring 源码中设计模式?这样回答面试官.才能显得你技高一筹.

时光毁灭记忆、已成空白 提交于 2020-08-10 19:53:55
一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。 二:工厂方法模式 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。 一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。 就以工厂方法中的静态方法为例讲解一下: 建一个config.xm配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称: 三:单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。 核心提示点

仔细想想SpringAOP也不难嘛,面试没有必要慌

送分小仙女□ 提交于 2020-08-10 15:33:44
文章已托管到 GitHub ,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! LOGO SpringAOP 一、什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,利用一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。 应用场景: 如日志记录、审计、声明式事务、安全性和缓存等。 二、场景分析 为了更好的理解AOP,渗透面向切面编程的思想。我这里举一个开发中很常见的例子。打印日志 首先,我们要先理解什么是日志。 日志: 日志是一种可以追踪某些软件运行时所发生事件的方法,软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可包含可选变量数据的消息来描述,此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level)。开发者可以通过区分严重性级别来分析出想要的信息。 了解了什么是日志,那就要知道怎么打印日志,在哪里打印日志。打印日志,是引入依赖

浅析Spring中AOP的实现原理——动态代理

醉酒当歌 提交于 2020-08-10 14:13:12
一、前言   最近在复习 Spring 的相关内容,刚刚大致研究了一下 Spring 中, AOP 的实现原理。这篇博客就来简单地聊一聊 Spring 的 AOP 是如何实现的,并通过一个简单的测试用例来验证一下。废话不多说,直接开始。 二、正文 2.1 Spring AOP的实现原理    Spring 的 AOP 实现原理其实很简单,就是通过 动态代理 实现的。如果我们为 Spring 的某个 bean 配置了切面,那么 Spring 在创建这个 bean 的时候,实际上创建的是这个 bean 的一个代理对象,我们后续对 bean 中方法的调用,实际上调用的是代理类重写的代理方法。而 Spring 的 AOP 使用了两种动态代理,分别是 JDK的动态代理 ,以及 CGLib的动态代理 。 (一)JDK动态代理    Spring默认使用JDK的动态代理实现AOP,类如果实现了接口,Spring就会使用这种方式实现动态代理 。熟悉 Java 语言的应该会对 JDK 动态代理有所了解。 JDK 实现动态代理需要两个组件,首先第一个就是 InvocationHandler 接口。我们在使用 JDK 的动态代理时,需要编写一个类,去实现这个接口,然后重写 invoke 方法,这个方法其实就是我们提供的代理方法。然后 JDK 动态代理需要使用的第二个组件就是 Proxy 这个类

天天用 Spring,bean 实例化原理你懂吗?

浪子不回头ぞ 提交于 2020-08-10 14:01:32
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 本次主要想写spring bean的实例化相关的内容。创建spring bean 实例是spring bean 生命周期的第一阶段。 bean 的生命周期主要有如下几个步骤: 创建bean的实例 给实例化出来的bean填充属性 初始化bean 通过IOC容器使用bean 容器关闭时销毁bean 在实例化bean之前在BeanDefinition里头已经有了所有需要实例化时用到的元数据,接下来spring 只需要选择合适的实例化方法以及策略即可。实例化方法有两大类分别是工厂方法和构造方法实例化,后者是最常见的。 spring默认的实例化方法就是无参构造函数实例化。 如我们在xml里定义的 以及用注解标识的bean都是通过默认实例化方法实例化的。 两种实例化方法(构造函数 和 工厂方法) 源码阅读 实例化策略(cglib or 反射) 两种实例化方 使用适当的实例化方法为指定的bean创建新实例:工厂方法,构造函数实例化。 代码演示 启动容器时会实例化所有注册的bean(lazy-init懒加载的bean除外),对于所有单例非懒加载的bean来说当从容器里获取bean(getBean(String name))的时候不会触发,实例化阶段,而是直接从缓存获取已准备好的bean

设计模式之代理模式

送分小仙女□ 提交于 2020-08-10 04:14:14
代理模式 作用:在不改变原有代码的基础上,增加或扩展额外的功能 静态代理 //1,被代理类需要实现的接口,代理类也要实现该接口,该接口对用户使用 interface FlightMachine{ void fly(); } //2,被代理类实现接口 class FlightMachineImpl implements FlightMachine{ @Override public void fly() { System.out.println("我可以飞"); } } //3,代理类实现接口 class FlightProxy implements FlightMachine{ //4,代理类引用被代理对象 private FlightMachine flightMachine; //5,写有参构造方法得到被代理对象实例 public FlightProxy(FlightMachine flightMachine){ super(); this.flightMachine=flightMachine; } @Override public void fly() { //增加额外的功能 System.out.println("我可以发射导弹"); flightMachine.fly(); //增加额外的功能 System.out.println("我可以航拍"); } }

终于有人把 java代理 讲清楚了,万字详解!

纵然是瞬间 提交于 2020-08-09 16:28:33
什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 ​代理其实不仅仅是在软件开发领域,在我们的日常生活中也是时常可见。比如某p2p老板突然携款带着小姨子跑路了,可怜了下面一堆的程序员背负一身房贷,上有老下有小,程序员只能被迫去申请劳动仲裁,劳动局就会为其指派一位代理律师全权负责程序员的仲裁事宜(PS:p2p跑路仲裁拿回工资的可能性非常低,没让你把工资退回就算好的了)。那这里面就是使用了代理模式,因为在劳动仲裁这个活动中,代理律师会全权代理程序员。比如:房东要将房子出售,于是到房地产中介公司找一个中介(代理),由他来帮房东完成销售房屋,签订合同、网签、贷款过户等等事宜。 代理模式 这是常见代理模式常见的 UML 示意图。 需要注意的有下面几点: 用户只关心接口功能,而不在乎谁提供了功能。上图中接口是 Subject 。 接口真正实现者是上图的 RealSubject ,但是它不与用户直接接触,而是通过代理。 代理就是上图中的 Proxy ,由于它实现了 Subject 接口,所以它能够直接与用户接触。

JDK动态代理和 CGLIB 代理

六眼飞鱼酱① 提交于 2020-08-08 18:35:36
JDK动态代理和 CGLIB 代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期期间创建一个接口的实现类来完成对目标对象的代理。 代码示例 接口 public interface IUserDao { void save(); } 实现类 public class UserDao implements IUserDao { @Override public void save() { System.out.println("=====已经保存数据======="); } } 代理类 public class DynamicJdkProxy { /** * 维护一个目标对象 */ private Object target; public DynamicJdkProxy(Object target) { this.target = target; } /** * 给目标对象生成代理对象 * * @return */ public Object getProxyInstance() { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override

超全!Java基础知识点总结

谁都会走 提交于 2020-08-08 10:15:57
本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结。Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理。 纸上得来终觉浅,绝知此事要躬行。笔者之前对每部分的内容对做了比较深入的学习以及代码实现,基本上比较全面地讲述了每一个Java基础知识点,当然可能有些遗漏和错误,欢迎读者指正。 Java基础知识点总结 每部分内容会重点写一些常见知识点,方便复习和记忆,但并不是全部内容。 面向对象三大特性 继承:一般类只能单继承,内部类实现多继承,接口可以多继承 封装:访问权限控制public > protected > 包 > private 内部类也是一种封装 多态:编译时多态,体现在向上转型和向下转型,通过引用类型判断调用哪个方法(静态分派)。 运行时多态,体现在同名函数通过不同参数实现多种方法(动态分派)。 基本数据类型 基本类型位数,自动装箱,常量池。 例如byte类型是1byte也就是8位,可以表示的数字是-128到127,因为还有一个0,加起来一共是256,也就是2的八次方。 32位和64位机器的int是4个字节也就是32位,char是1个字节就是8位,float是4个字节,double是8个字节,long是8个字节。 基本数据类型的包装类只在数字范围-128到127中用到常量池