cglib

详解 Java 中的三种代理模式!

孤者浪人 提交于 2020-03-27 14:21:32
3 月,跳不动了?>>> 作者:岑宇 https://www.cnblogs.com/cenyu/p/6289209.html 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子. 用图表示如下: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象. 1.1.静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 下面举个案例来解释: 模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口

Spring AOP面向切面编程

独自空忆成欢 提交于 2020-03-27 10:59:28
目录 1.AOP概览 2.Spring AOP的使用举例 PointCut切入点 Advice通知 3.Spring AOP的实现原理 3.1运行时织入 3.1.1代理模式 3.1.2 JDK动态代理 3.1.3 cglib动态代理 3.1.4 Spring如何创建代理bean ProxyFactoryBean的getObject()方法 getSingletonInstance()方法 createAopProxy() DefaultAopProxyFactory的createAopProxy()方法 getProxy(aopProxy) JdkDynamicAopProxy.getProxy()方法 ObjenesisCglibAopProxy.getProxy()方法 4.Spring AOP的实现原理 4.1 链式调用 4.1.1 职责链模式 4.1.1.1 V1 4.1.1.2 V2 4.1.2 Spring内部实现 1)拦截器链是如何生成的 2)拦截器链是如何链式调用的 3)Spring使用职责链模式实现拦截器链链式调用 5. ProxyFactory实现AOP 1.AOP概览 AOP(Aspect Oriented Programming),什么是面向切面编程? 1)AOP是一种编程范式,不是编程语言 编程范式概览 面向过程编程 面向对象编程 函数式编程 事件驱动编程

Spring的两种动态代理:Jdk和Cglib 的区别和实现

让人想犯罪 __ 提交于 2020-03-25 20:43:46
https://www.cnblogs.com/leifei/p/8263448.html 一、原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? (1)添加CGLIB库,SPRING_HOME/cglib/*.jar (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/> JDK动态代理和CGLIB字节码生成的区别? (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类 (2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final 二、代码实现 用户管理接口 package com.lf.shejimoshi.proxy.entity; //用户管理接口

Java设计模式之代理设计模式

核能气质少年 提交于 2020-03-25 08:44:48
3 月,跳不动了?>>> 概念 举例:我要灭了传说中的山口组,我通知青龙帮,然后青龙帮 帮我灭了,最终达到了我要灭山口组的目的,我亲自灭和别人帮我灭结果都一样的,所以,青龙帮就相当于代替了我,这种方式叫代理模式。 2、技术点(反射) 了解下反射,可能只讲代理设计模式的话可能你不需要掌握,但是代理设计模式的应用场景会讲到,还是希望你能够了解下反射知识点。 3、代理设计模式 3.1 静态代理 1、概念:目标对象、和代理对象统一实现一样的接口 缺点,代理类太多的情况,一旦增加接口方法,那么目标对象与代理对象都要重新修改和维护。 2、代码讲解 类:接口IUserDao、实现接口的两个类,目标类和代理类 GirlUser和ProxyGirl,最后main函数执行(java9版本以上) 代码如下 public interface IUserDao { public static final String girlName ="七七"; void miss(String boyName); static void love(){ System.out.println("恋爱"); }; default void noLove(){ System.out.println("高冷,不谈恋爱"); } private static void securt(){ System.out.println(

你真的懂Spring Java Config 吗?Full @Configuration vs lite @Bean mode

时光总嘲笑我的痴心妄想 提交于 2020-03-24 23:41:35
3 月,跳不动了?>>> Full @Configuration 和 lite @Bean mode 是 Spring Java Config 中两个非常有意思的概念。 先来看一下官方文档关于这两者的相关内容: The @Bean methods in a regular Spring component are processed differently than their counterparts inside a Spring @Configuration class. The difference is that @Component classes are not enhanced with CGLIB to intercept the invocation of methods and fields. CGLIB proxying is the means by which invoking methods or fields within @Bean methods in @Configuration classes creates bean metadata references to collaborating objects. Such methods are not invoked with normal Java semantics but rather

@Component和@Configuration作为配置类的差别

谁都会走 提交于 2020-03-24 23:16:15
3 月,跳不动了?>>> 本文章向大家介绍@Component和@Configuration作为配置类的差别,主要包括@Component和@Configuration作为配置类的差别使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 随着spingboot的大火,注解式配置受到了大家的热烈欢迎,而@Component和@Configuration都可以作为配置类,之前一直都没觉得这两个用起来有什么差别,可能有时程序跑的和自己想的有所区别也没注意到。 直到看到这篇文章:https://my.oschina.net/guangshan/blog/1807721 。我意识到@Component和@Configuration是有区别的,错误的使用可能会导致严重的后果。 请看下面一段代码: @Configuration public class MyTestConfig { @Bean public Driver driver () { Driver driver = new Driver(); driver.setId( 1 ); driver.setName( "driver" ); driver.setCar(car()); return driver; } @Bean public Car car () { Car car = new

面试刷题6:反射和动态代理是什么?

房东的猫 提交于 2020-03-24 19:43:32
3 月,跳不动了?>>> 反射和动态代理是什么? 反射是java提供的一种自省能力,可以在运行时创建类的实例,访问成员变量,方法。 动态代理是程序在运行时构建代理对象动态动用方法。 反射和动态代理是第三方框架进行封装的基础。 反射 程序提供的一种自省能力,可以在运行时操作类和对象。 提供的核心类如下: Class: 获取类的定义 Field : 获取申明的属性 Method: 获取申明的方法 Constructor : 构造新对象 需要注意setAccessble(Boolean)方法; 可以修改反射的相关对象的访问控制权限; 比如: ORM框架自动生成set,get方法;<br />某些API的private成员和方法的操作,定制API的功能; 动态代理 运行时自动构建代理,处理方法调用; 实现方式有: jdkProxy, cglib; 对比项目 说明 JdkProxy 1.代码简单<br />2,无额外依赖<br />3,可以跟随jdk平滑升级 Cglib 1,性能优<br />2,不用实现额外接口<br />3,只关心操作的类 常见应用:RPC调用,AOP 下面的代码是使用jdkProxy的例子: public class MyDynamicProxy { public static void main (String[] args) { HelloImpl hello =

JDK动态代理和Cglib的动态代理

匆匆过客 提交于 2020-03-24 13:37:14
3 月,跳不动了?>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需要被代理的类需要有接口,否则无法实现 package proxy.dynamic; public interface IBook { void add(); } 实现接口的类如下 package proxy.dynamic; public class Book implements IBook { @Override public void add() { System.out.println("Add Method!"); } } 创建一个代理类,需要实现一个接口InvocationHandler接口,里面有一个invoke方法需要实现 同时创建一个生成实例的方法 package proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BookProxy implements InvocationHandler{ private Object target; public Object bind(Object

Java动态代理之一CGLIB详解

我的未来我决定 提交于 2020-03-24 09:59:33
在上篇文章《 Java代理模式及动态代理详解 》中我们介绍了Java中的静态代理模式与动态代理模式,并以JDK原生动态代理作为示例进行讲解。本篇文章我们来介绍一下基于CGLIB实现的动态代理,并与原生动态代理进行对比。 CGLIB介绍 CGLIB(Code Generation Library)是一个开源、高性能、高质量的Code生成类库(代码生成包)。 它可以在运行期扩展Java类与实现Java接口。Hibernate用它实现PO(Persistent Object 持久化对象)字节码的动态生成,Spring AOP用它提供方法的interception(拦截)。 CGLIB的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。但不鼓励大家直接使用ASM框架,因为对底层技术要求比较高。 使用实例 首先,引入CGLIB的依赖: <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> 这里我们以操作用户数据的UserDao为例,通过动态代理来对其功能进行增强(执行前后添加日志)。UserDao定义如下: public class UserDao { public void findAllUsers(){

Java动态代理之一CGLIB详解

大憨熊 提交于 2020-03-24 09:26:32
3 月,跳不动了?>>> 在上篇文章《 Java代理模式及动态代理详解 》中我们介绍了Java中的静态代理模式与动态代理模式,并以JDK原生动态代理作为示例进行讲解。本篇文章我们来介绍一下基于CGLIB实现的动态代理,并与原生动态代理进行对比。 CGLIB介绍 CGLIB(Code Generation Library)是一个开源、高性能、高质量的Code生成类库(代码生成包)。 它可以在运行期扩展Java类与实现Java接口。Hibernate用它实现PO(Persistent Object 持久化对象)字节码的动态生成,Spring AOP用它提供方法的interception(拦截)。 CGLIB的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。但不鼓励大家直接使用ASM框架,因为对底层技术要求比较高。 使用实例 首先,引入CGLIB的依赖: <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> 这里我们以操作用户数据的UserDao为例,通过动态代理来对其功能进行增强(执行前后添加日志)。UserDao定义如下: public class UserDao { public void