zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

CGLIB与JDK动态代理区别

区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

代理模式

什么是代理?

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程。

代理应用场景

安全代理 可以屏蔽真实角色

远程代理 远程调用代理类RMI

延迟加载 先加载轻量级代理类,真正需要在加载真实

代理的分类

静态代理(静态定义代理类)

动态代理(动态生成代理类)

Jdk自带动态代理

Cglib 、javaassist(字节码操作库)

静态代理

静态代理需要自己生成代理类


public class XiaoMing implements Hose {

@Override

public void mai() {

System.out.println("我是小明,我要买房啦!!!!haha ");

}

}

class Proxy  implements Hose {

private XiaoMing xiaoMing;

public Proxy(XiaoMing xiaoMing) {

this.xiaoMing = xiaoMing;

}

public void mai() {

System.out.println("我是中介 看你买房开始啦!");

xiaoMing.mai();

System.out.println("我是中介 看你买房结束啦!");

}

public static void main(String[] args) {

Hose proxy = new Proxy(new XiaoMing());

proxy.mai();

}

}

JDK动态代理(不需要生成代理类)

实现InvocationHandler 就可以了。


public interface Hose {

/**

*

@methodDesc: 功能描述:(买房代理)

@author: 余胜军

@param:

@createTime:2017年8月27日 上午2:54:34

@returnType: void

@copyright:上海每特教育科技有限公司

*/

public void mai();

}

public class XiaoMing implements Hose {

@Override

public void mai() {

System.out.println("我是小明,我要买房啦!!!!haha ");

}

}


public class JDKProxy implements InvocationHandler {

private Object tarjet;

public JDKProxy(Object tarjet) {

this.tarjet = tarjet;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("我是房产中介.....开始监听你买房啦!");

Object oj = method.invoke(tarjet, args);

System.out.println("我是房产中介.....结束监听你买房啦!");

return oj;

}

}

class Test222 {

public static void main(String[] args) {

XiaoMing xiaoMing = new XiaoMing();

JDKProxy jdkProxy = new JDKProxy(xiaoMing);

Hose hose=(Hose) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(), xiaoMing.getClass().getInterfaces(), jdkProxy);

hose.mai();

}

}

CGLIB动态代理

实现


 

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 Cglib implements MethodInterceptor {

 

     @Override

     public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxythrows Throwable {

         System.out.println("我是买房中介  开始监听你买房了....");

         Object invokeSuper = methodProxy.invokeSuper(oargs);

         System.out.println("我是买房中介  开结束你买房了....");

         return invokeSuper;

 

     }

 

}

 

class Test22222 {

     public static void main(String[] args) {

         Cglib cglib = new Cglib();

         Enhancer enhancer = new Enhancer();

         enhancer.setSuperclass(XiaoMing.class);

         enhancer.setCallback(cglib);

         Hose hose = (Hose) enhancer.create();

         hose.mai();

     }

}

CGLIB与JDK动态代理区别

区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

原文地址:https://www.cnblogs.com/super-admin/p/9728827.html

时间: 2024-10-14 17:09:48

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理的相关文章

代理模式-静态代理与动态代理

简介 首先感谢沽泡学院 tom 老师 代理模式是一种结构型模式 代理模式就是代理对象帮被代理对象处理一些问题, 类似中介, 客户只要结果, 中介怎么搞是他的事儿, 他可能再处理过程中赚外快什么的 代理模式的应用: spring中的aop, 日常工作中记录日志, 统计时间,权限控制等 这里我们使用一个客户端代理访问google举例, 具体细节可能不合适, 意会.意会.意会... 静态代理 /** * 一个服务器接口, 服务器有很多功能, 可以用来路由, 建站等... */ public inter

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

【Java】代处理?代理模式 - 静态代理,动态代理

>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算,见[Java]Float计算不准确) package com.nicchagil.study.java.demo.No09代理.No01不用代理; import java.math.BigDecimal; public class FloatCalculator { public float add(fl

代理模式(静态代理)的通俗理解

代理模式分为两种:静态代理和动态代理. 首先不谈模式,举一个例子: 有一队很美丽的妹子,她们都是训练有素的迎宾小姐.平时忙于训练再加上人脉与广告投入不多,生意并不好.于是她们的老大提议去找一个礼仪公司合作,请他们把迎宾的活儿包给她们来做.恰好在某个公司有个接待外宾的活动,该活动交给一个这个知名的礼仪公司负责,礼仪公司就通知了迎宾小姐.在外宾下车时就要乐队奏乐,走到公司门口时,迎宾小姐需要致以问候.现在来模拟一下这个情景. //相当于迎宾小姐(委托类) public class HelloWorl

java 设计模式 - 代理模式 - 静态代理

代理模式:使用环境无法直接使用对象A(委托对象),可以使用对象B(代理对象)调用对象A已达到直接调用对象A的效果,就成为代理模式. 其中A为委托对象,B为代理对象. 静态代理的优缺点: 优点: 1.代码只管,可以清楚理解委托雷以及代理类. 2.在编译期加入,提前就指定好了委托类,代理类,效率高. 缺点: 1.静态代理很麻烦,需要大量的代理类,不易于代码维护等 当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码,改的多了就很有可能出问题,必须要重新测试. 2.重复的代码会出现在

Java 代理模式(二) Java中的动态代理

动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Object invoke(Object proxy, Method method, Object[] args) 在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组(无参时设置为null). 这个抽象方法在代理类中动态实现. 2

代理模式---静态代理

一,静态代理介绍 了解设计模式中的代理模式的同学应该都知道如果想要为被代理类生成代理,需要让代理类和被代理类共同实现同一个接口,在代理类中增加额外逻辑来实现代理模式,这种方式在编译期间就已经确认了哪个类是代理类,被代理的又是哪个类,这都是需要开发人员在编译之前就编写好的,是为静态 1,代理模型的角色分析 抽象角色:一般会使用抽象类或者接口实现 真实角色:实体类,被代理的角色 代理角色:代理真实角色,而且可以附属一些其他操作 使用角色:使用代理角色进行操作 2,静态代理模式的优点 可以使真实角色更

使用SMM框架开发企业级应用-----代理(静态,JDK,CGLIB)

静态代理 步骤一:创建抽象主题(接口) 步骤二:真实业务代码 步骤三:测试 JDK代理 步骤一:创建抽象主题(接口) 步骤二:真实业务代码 步骤三:测试 CGLIB代理 步骤一:代码层 步骤二:测试 public class ServiceCglib { public static void main(String[] args) { //步骤一:目标对象 final Cglib cglib=new Cglib(); //步骤二:生成代理 Enhancer enhancer=new Enhanc

代理模式(静态代理)(工厂模式9)

//抽想角色定义代理角色与实际角色的对外开放的方法: //真实角色: //代理角色: 代理角色可以做很多东西,但不会做真实角色的独有属性(如唱歌) 只有通过真实角色的应用,调用真实角色方法,才可以真正的对症是角色 的代理: private RealStar realStar; public Proxy(RealStar realStar){ this.realStar= realStar; } 客户: 根据测试结果,只有sing()是本人执行,其他都有代理角色执行 类图: