Spring 静态代理+JDK动态代理和CGLIB动态代理
代理分为两种:静态代理 动态代理
静态代理:本质上会在硬盘上创建一个真正的物理类
动态代理:本质上是在内存中构建出一个类。
如果多个类需要进行方法增强,静态代理则需要创建多个物理类,占用磁盘空间。而动态代理则是在内存中创建,不会对磁盘进行影响。
静态代理和JDK动态代理需要有接口。 CGLIB动态代理无需有接口的情况下进行代理。实质:内存中构建出了目标类型的子类。
JDK动态代理是JDK提供的,CGLIB动态代理是Spring提供的。
代理模式的三个组件:抽象主题 真实主题 代理主题

静态代理:
接口(抽象主题)的代码:
//抽象主题
public interface Subject {
public void request();
}
目标对象(真实主题)的代码:
//真实主题
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("Subject RealSubject");
}
}
代理对象(代理主题)的代码:
package cn.Spring.Day09Staticporxy;
//代理主题
public class ProxySubject implements Subject {
//把真实主题当成代理主题的成员变量
private RealSubject rs=new RealSubject();
@Override
public void request() {
System.out.println("proxy");//在调用真实主题要增强的方法前进行增强
rs.request();
System.out.println("ProxySubject");//在调用真实主题要增强的方法后进行增强
}
}
JDK动态代理:
接口:
package cn.Spring.Day14JDKproxy;
public interface ISomeService {
public void request();
}
目标对象:
package cn.Spring.Day14JDKproxy;
public class SomeService implements ISomeService {
@Override
public void request() {
System.out.println("977+7777");
}
}
代理对象:
package cn.Spring.Day14JDKproxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class JdkProxy {
public static void main(String[] args) {
/*
* 1.使用Proxy点出newProxyInstance方法 方法有三个参数
* ClassLoader loader, 类加载器类型的一个对象
* Class<?>[] interfaces,接口数组对象
* InvocationHandler h InvocationHandler 对象
* 2.实例化目标对象 目标对象去传入参数。
* 3.invoke方法中使用method.invoke传入目标对象,和参数数组。
*
*
* */
final SomeService ss=new SomeService();
ISomeService proxy = (ISomeService)Proxy.newProxyInstance(ss.getClass().getClassLoader(), ss.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是增强666666");
method.invoke(ss,args);
return null;
}
});
proxy.request();
}
}
newProxyInstance要传的参数

invoke要传的参数

CGLIB动态代理:
目标对象:
package cn.Spring.Day10cglibProxy;
public class Service {
public void doSome(){
System.out.println("SSSSSService");
}
}
代理对象:
package cn.Spring.Day10cglibProxy; import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class ServiceTest {
public static void main(final String[] args) {
final Service service=new Service();
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(Service.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("写入日志");
Object invoke = methodProxy.invoke(service, args);
return invoke;
}
});
Service o = (Service)enhancer.create();
o.doSome(); }
}
Spring 静态代理+JDK动态代理和CGLIB动态代理的更多相关文章
- java的静态代理、jdk动态代理和cglib动态代理
Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...
- 代理模式之静态代理,JDK动态代理和cglib动态代理
代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。
借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...
- Spring <tx:annotation-driven>注解 JDK动态代理和CGLIB动态代理 区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)
代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- jdk动态代理和cglib动态代理的区别
一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...
- jdk 动态代理和 cglib 动态代理
原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载 ...
- 动态代理:jdk动态代理和cglib动态代理
/** * 动态代理类:先参考代理模式随笔,了解代理模式的概念,分为jdk动态代理和cglib,jdk动态代理是通过实现接口的方式创建代理类的,cglib是通过继承类的方式实现的代理类的 * jdk动 ...
随机推荐
- Spring Cloud的概述(二)
1.什么是spring cloud? spring cloud,基于spring boot提供了一套微服务的解决方案,包括服务的注册与发现,配置中心,全链路监控,服务网管,负载均衡,熔断等组件,除了基 ...
- 设计模式学习心得<外观模式 Facade>
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- python基础之Day14
一.生成器 1.什么是生成器 在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值称之为生成器,生成器本质就是迭代器 2.为什么要有生成器 生成器是一种自定义迭代器的方 ...
- Echarts 在动态HTML报告中的应用
# 参考官网 http://echarts.baidu.com/examples/ <scripts> <!--- echarts examples ---> </scr ...
- java 基本原则
开闭原则:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求. 可以通过“抽象约束.封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一 ...
- "车羊门问题"作业
作业完成人: 学号:20171301008 潘松泉: 学号:20171301022 陈霖彬: 1.按照你的第一感觉回答,你觉得不换选择能有更高的几率获得汽车,还是换选择能有更高的几率获得汽车?或几率没 ...
- RANSAC
一.概述 RANSAC(RANdom SAmple Consensus)随机抽样一致,是用来从一组观测数据中估计数学模型参数的一种方法.由于是观测数据,避免不了有误差存在,当误差太大了就变成了无效数据 ...
- 关于浏览器cookie的小知识
浏览器对于总的cookie数量是没有限制的,但是对于每个域名的cookie数量是有限制的. 一,不同的浏览器,对于一个域名的cookie数量限制上限是不同的: 1,IE6以下版本,最多20个.IE7以 ...
- oracle创建与mysql的dblink
1.先简单介绍下环境 操作系统:windows 2008 R2 (64bits) oracle数据库:10gr2 10.2.0.3.0(32bits) mysql数据库:5.1 (32bits) ...
- 软件光栅器实现(二、VS和PS的运作,法线贴图,切空间的计算)
二.软件光栅器的VS和PS的输入.输出和运作,实现法线贴图效果的版本.转载请注明出处. 这里介绍的VS和PS是实现法线映射的版本,本文仅介绍实现思路,并给出代码供参考.切空间计算.光照模型等相关公式不 ...