一、代理设计模式

1、设计模式:前人总结一套解决特定问题的代码

2、代理设计模式优点:

    2.1 保护真实对象

    2.2 让真实对象职责更明确

    2.3 扩展

3、代理设计模式

    3.1 真实对象(老总)

    3.2 代理对象(秘书)

    3.3 抽象对象(抽象功能),(谈小目标)

二、静态代理设计模式

1、由代理对象代理所有真实对象的功能

  1.1 自己编写代理类

  1.2 每个代理的功能需要单独编写

2、静态代理设计模式的缺点:

  2.1 当代理功能比较多时,代理类中方法需要写很多

三、动态代理

  1、为了解决静态代理频繁编写代理功能缺点

  2、分类:

    2.1、JDK提供的

    2.2、cglib 动态代理

四、JDK动态代理

  1、和 cglib动态代理对比

    1.1、 优点:jdk自带,不需要额外导入jar

    1.2、缺点:

      1.2.1 真实对象必须实现接口

      1.2.2 利用反射机制,效率不高

  2、基于反射实现动态代理

  实例:

public class Laozong implements Gongneng{
@Override
public void chifan() {
System.out.println(" 吃饭");
}
@Override
public void xiaomubiao() {
System.out.println(" 谈小目标");
}
}
public interface Gongneng {
void chifan();
void xiaomubiao();
}
public class Mishu implements InvocationHandler{
private Laozong laozong=new Laozong();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("您有预约时候吗???");
Object result = method.invoke(laozong, args);
System.out.println("收集访客信息");
return result;
}
}
public class Women {
public static void main(String[] args) {
Mishu mishu=new Mishu();
//第一个参数:类加载器
//第二个参数:proxy需要实现什么接口
//第三个参数:通过接口对象调用方法时,需要调用哪个类的invoke方法
Gongneng gongneng = (Gongneng) Proxy.newProxyInstance(Women.class.getClassLoader(),new Class[]{Gongneng.class},mishu);
gongneng.chifan();
gongneng.xiaomubiao();
}
}

五、cglib动态代理

1、cglib优点:

  1.1 基于字节码,生成真实对象的子类

    1.1.1 运行效率高于JDK动态代理

  1.2 不需要实现接口

2、cglib缺点:

  2.1 非JDK功能,需要额外导入jar

3、使用spring aop时,只要出现Proxy 和真实对象转换异常:

  3.1、 设置为true 使用 cglib

  3.2、设置为false使用 jdk(默认值)

<aop:aspectj-autoproxy proxy-target-class="false"></aop:aspectj-autoproxy>

4、实例:

public class Laozong {
public void chifan(){
System.out.println("吃饭");
}
public void xiaomubiao(){
System.out.println("小目标");
}
}
public class Mishu implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("预约时间");
Object result = arg3.invokeSuper(arg0, arg2);
System.out.println("收集信息");
return result;
}
}
public class Women {
public static void main(String[] args) {
Enhancer enhan=new Enhancer();
enhan.setSuperclass(Laozong.class);
enhan.setCallback(new Mishu()); Laozong laozong = (Laozong) enhan.create();
laozong.chifan();
laozong.xiaomubiao();
}
}

代理设计模式 (静态代理设计模式)+ 动态代理(JDK和Cglib)的更多相关文章

  1. 代理模式(Proxy)--动态代理(JDK)

    在是上一篇博客中实现了静态代理. 在上篇的结尾提到了一个问题: 思考:如果我们下需要对火车,自行车实现相同的代理,我们又该如何实现呢? 这篇博客就来解决这个问题: 解决这类问题需要用到动态代理技术,实 ...

  2. Java动态代理:一个面包店的动态代理帝国

    文章首发于[博客园-陈树义],点击跳转到原文大白话说Java动态代理:一个面包店的动态代理帝国 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中, ...

  3. 代理模式(Proxy)--动态代理(CGLIB)

    上一篇:代理模式(Proxy)--动态代理(jdk) (1)CGLIB技术是第三方代理技术,可以对任何类生成代理,代理的原则是对目标对象进行继承代理 (2)如果目标对象被final修饰,则无法被CGL ...

  4. TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理

    代理:为了增强方法在不添加代码的情况下 1.Proxy基于接口的动态代理 /** * 模拟一个消费者 * @author Administrator * */ public class Client ...

  5. java设计模式(一)动态代理模式,JDK与CGLIB分析

    -本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...

  6. Java动态代理机制详解(类加载,JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  7. Java 代理模式 (二) 动态代理

    代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...

  8. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  9. 【Java】代理模式、反射机制-动态代理

    关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...

  10. 动态代理案例1:运用Proxy动态代理来增强方法

    动态代理案例1: /*要求:运用Proxy动态代理来增强方法 题目:    1.定义接口Fruit,其中有addFruit方法    2.定义实现类FruitImpl,实现Fruit接口    3.定 ...

随机推荐

  1. BGRA与BGR的相互转换

    BGRA转BGR void BgraToBgr(BYTE *bgraData,int *bgraSize) { ,j=; j<*bgraSize; i+=,j+=) { *(bgraData+i ...

  2. NumPy 统计函数

    NumPy 统计函数 NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等. 函数说明如下: numpy.amin() 和 numpy.amax() numpy.a ...

  3. Java 的静态工厂方法

    本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...

  4. SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用

    1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1 ...

  5. [leetcode]133. Clone Graph 克隆图

    题目 给定一个无向图的节点,克隆能克隆的一切 思路 1--2 | 3--5 以上图为例, node    neighbor 1         2, 3 2         1 3         1 ...

  6. 5-java 排序, sort, collections.sort()

    https://blog.csdn.net/whp1473/article/details/79678974 import java.util.ArrayList; import java.util. ...

  7. FragmentManager V4包下 应该用FragmentActivity

    import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity ...

  8. Xshell无法使用root远程登录Ubuntu16服务器

    修改/etc/ssh/sshd_config文件,把PermitRootLogin Prohibit-password 添加#注释掉 新添加:PermitRootLogin yes 2. 重启ssh服 ...

  9. springboot报错Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

    springboot项目在启动时需要把servlet容器编译进去,这时候如果你的maven依赖里面没有配置jetty或者tomcat相关依赖就会报错. 解决方法: jetty添加 <depend ...

  10. 我的开发小tip

    开发原则:1.谁开发,谁负责到底.自己的开发的模块自己维护,不要让别人替你维护,否则很麻烦:2.合理分配时间3.谨慎的处理遇到的bug和问题,不是自己开发的不要轻举妄动,提交到待办中即可4.万勿过度设 ...