动态代理

CGLIB动态代理简介

余生颓废 提交于 2020-02-10 17:51:11
一:前序 一开始对动态代理都不懂,一直心里还是很惧怕这个概念,之前也学过,学过就忘了,现在想想之所以忘了,是因为平时在开发中也不会使用到动态代理,那回过头再想想,自己已经做了六年多的开发了,那为什么还要学习这个了,今天想想也许就是技多不压身,其实只有知道的多了,才会在用到的时候,用起来,我想也有种说法是用到的时候再学也可以,但是在平时的开发中,我们很少会用到,可能是我们不知道动态代理,如果知道也许会在平时中使用它。之所以今天想做个总结是想到动态代理还是有很大的用处,只是我之前不知道。 二:CGLIB介绍 下面做个总结,动态代理里面有两种方式,一种是jdk的动态代理,一种是cglib动态代理,这里做个cglib动态代理,jdk的动态代理,将单独写个专题来介绍 CGLIB是一个强大的高性能的代码生成包,CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类,当然不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉,在引入cglibjar包后,也会导入ASMjar包 三:CGLIB实现 springboot支持的事务方式:@EnableTransactionManagement 在启动方法入口的类中添加 spring支持方式 :<aop:aspectj-autoproxy proxy-target-class=

Spring AOP的使用及源码解读 (一)

ε祈祈猫儿з 提交于 2020-02-07 11:13:12
前言 AOP[底层是动态代理]为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。(百度百科的解释) 其实按通俗话理解就是对我们的方法进行增强。也就是在我们执行方法的前,后,结束返回等情况增加相应的通知(在Java中的表现就是相应的控制台打印) 1.创建相关AOP的应用实例(如何用?) 我们编写相关spring AOP的实例的时候,首先要编写一个业务类如Calculator(这个类就是我们要进行切面增强的类),还有一个相关的切面类如LogAspects (这个类主要是对我们业务类的方法进行增强)和一个最重要的配置类如Cap10MainConfig(对相关bean注入的一个声明) (1)记得在编写前导入相应的依赖(在Maven工程中的pom.xml下) <!-- 使用AOP需要导入 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.6.RELEASE</version> </dependency> (2)编写业务类(Calculator.class) package com.enjoy.cap10.aop; public

动态代理的原理

ε祈祈猫儿з 提交于 2020-02-06 05:23:17
1、定义一个接口 2、定义一个类来实现该接口 3、使用proxy来动态获取对象的方法,并通过三种不同的方法来增强实体对象的方法(参数增强,返回值增强,方法体增强)package cn.hopetesting.proxy;/** * @author newcityman * @date 2019/9/13 - 15:22 */public interface SaleComputer { public String sale(double money); public void show();} package cn.hopetesting.proxy;/** * @author newcityman * @date 2019/9/13 - 15:24 */public class lenovo implements SaleComputer { @Override public String sale(double money) { System.out.println("花了"+money+"元买了一台联想电脑....."); return "联想电脑"; } @Override public void show() { System.out.println("炫耀电脑"); }} package cn.hopetesting.proxy;import com.sun

cglib动态代理

折月煮酒 提交于 2020-02-06 05:10:08
cglib动态代理相比于JDK动态代理的的优秀之处在于它是够实现非接口的动态代理,且提供了多种回调方式,这里就将callbackFilter和MethodInterceptor两种 被代理类 package com.yangpeng.proxy; public class BookPorxyImpl { public void addBook() { System.out.println("增加图书的普通放方法"); } public void addBall() { System.out.println("增加Ball的普通放方法"); } } 提供统一的回调方式,cglib的主要回调是MethodInterceptor接口,和用于创建动态代理的Enhancer类 package com.yangpeng.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class BookProxyLib implements MethodInterceptor{ private Object target;/

静态代理和动态代理的代码笔记

感情迁移 提交于 2020-02-06 03:56:06
基础类,创建一个接口和一个实现方法 package com.opk.proxy; public interface BuyHouse { void buyHouse(); } package com.opk.proxy; public class BuyHouseImpl implements BuyHouse { @Override public void buyHouse() { System.out.println("我要买房"); } } 静态代理的实现 package com.opk.proxy; public class BuyHouseProxy implements BuyHouse { private BuyHouse buyHouse; public BuyHouseProxy(final BuyHouse buyHouse) { this.buyHouse = buyHouse; } @Override public void buyHouse() { System.out.println("买房前准备"); buyHouse.buyHouse(); System.out.println("买房后装修"); } } package com.opk.proxy; public class ProxyTest { public static void main

Mybatis原理

天涯浪子 提交于 2020-02-06 03:40:42
1. SqlSessionFactory 2.SqlSession sqlSession实现类有:DefaultSqlSession , SqlSessionManager SqlSessionFactory 实现类:DefaultSqlSessionFactory和 SqlSessionManager 根据DefaultSqlSession源码可以知道 似乎一切的一切,都是从配置对象Configuration中取出材料来 委托执行器去处理 查看部分 SqlSessionFactory源码可知道: 创建一个DefaultSqlSession并返回 贯穿Mybatis执行流程的 Executor 接口 SqlSessionManager分析: SqlSessionManager同时实现了SqlSession和SqlSessionFactory 使用的代理是 JDK动态代理 Mybatis Mapper的代理对象的创建 来源: CSDN 作者: 刘赵强 链接: https://blog.csdn.net/liuqiang211/article/details/104183677

JDK动态代理和CGLIB动态代理

ぃ、小莉子 提交于 2020-02-06 03:18:22
JDK动态代理 //1.影星接口 package com.entity; //影星接口 public interface MovieStar { public void act();//演戏 } //2.被代理类----实现一个接口 package com.entity; //成龙 public class ChengLongStar implements MovieStar{ @Override public void act() { System.out.println("我是成龙,我会拍戏"); } } //3.代理类----实现InvocationHandler接口 package com.entity; import java.lang.reflect.InvocationHandler;//java的设计模式 import java.lang.reflect.Method; import java.lang.reflect.Proxy; //成龙的经纪人类 public class ChengLongProxy implements InvocationHandler{ //被代理的原始对象 private Object orientObject;//被代理对象 //绑定被代理对象,返回一个代理对象 public Object bind(Object obj){

20191218JDK和CGLIB动态代理区别

半腔热情 提交于 2020-02-05 09:35:03
前言 Spring代码实例:https://github.com/yihonglei/spring-study JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785 CGLIB动态代理实现原理:https://blog.csdn.net/yhl_jxy/article/details/80633194 一 JDK和CGLIB动态代理原理 1、JDK动态代理 利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler来处理。 2、CGLIB动态代理 利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 3、何时使用JDK还是CGLIB? 1)如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。 2)如果目标对象实现了接口,可以强制使用CGLIB实现AOP。 3)如果目标对象没有实现了接口,必须采用CGLIB库,Spring会自动在JDK动态代理和CGLIB之间转换。 4、如何强制使用CGLIB实现AOP? 1)添加CGLIB库(aspectjrt-xxx.jar、aspectjweaver-xxx.jar、cglib-nodep-xxx.jar) 2

动态代理详解

耗尽温柔 提交于 2020-02-03 19:37:46
动态代理详解     动态代理 它可以直接给某一个 目标对象 生成一个 代理对象 ,而不需要代理类存在。     动态代理与代理模式原理是一样的,只是它 没有具体的代理类 ,直接通过 反射 生成了一个代理对象。     动态代理生成技术:         1. 基于jdk提供一个 Proxy类 ,可以直接给实现某接口的实现类直接生成代理对象。         2. 基于cglib (spring框架会学习)     java.lang.reflect.Proxy;   该类可以直接生成一个代理对象。     Proxy类的方法 :         public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例。             仅能代理实现至少一个接口的类(即目标对象需要至少有一个接口)。             ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。             Class[]:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。             InvocationHandler: 策略(方案)设计模式 的应用。 如何去具体实现代理

动态代理

不羁岁月 提交于 2020-02-03 19:36:08
创建代理 InvocationHandler接口 常见用例 数据库连接以及事物管理 单元测试中的动态Mock对象 自定义工厂与依赖注入(DI)容器之间的适配器 类似AOP的方法拦截器 利用Java反射机制你可以在运行期动态的创建接口的实现。java.lang.reflect.Proxy类就可以实现这一功能。这个类的名字(译者注:Proxy意思为代理)就是为什么把动态接口实现叫做动态代理。动态的代理的用途十分广泛,比如数据库连接和事物管理(transaction management)还有单元测试时用到的动态mock对象以及AOP中的方法拦截功能等等都使用到了动态代理。 创建代理 你可以通过使用Proxy.newProxyInstance()方法创建动态代理。newProxyInstance()方法有三个参数: 1、类加载器(ClassLoader)用来加载动态代理类。 2、一个要实现的接口的数组。 3、一个InvocationHandler把所有方法的调用都转到代理上。 如下例: InvocationHandler handler = new MyInvocationHandler(); MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new