为什么需要代理模式?

代理对象处于访问者和被访问者之间,可以隔离这两者之间的直接交互,访问者与代理对象打交道就好像在跟被访者者打交道一样,因为代理者通常几乎会拥有全部被代理者的职能,代理对象能够处理的访问请求就不必要劳烦被访问者来处理了.

  • 代理对象可以减少被访问者的负担,
  • 在转发访问请求之前或者之后加入特定的逻辑.比如安全限制,或者做一些中间操作
  • 便于通过配置, 直接修改实际的实现类
  • 便于测试

讲讲静态代理模式的优点及其瓶颈?

直接编写实现方法的代理类, 这种代理方式称为静态代理, 这也是效率最高的一种方式, 因为所有的类都是已经编写完成的, 客户端只需要取得代理对象并且执行即可.

静态代理虽然效率较高, 但其缺点在于要为每个接口实现一个代理类, 而这些代理类中的代码几乎是一致的, 这在大型系统中将会产生很大的维护问题.

对Java 接口代理模式的实现原理的理解?

使用 Proxy 和 InvocationHandler 来实现

对于接口A, 以及其实现类AImpl,

创建一个子类 MyInvocationHandler, 继承自 InvocationHandler , 其构造参数可以用 AImpl, 也可以不用

Proxy.newProxyInstance() , 输入指定的接口和MyInvocationHandler实例, 创建其代理对象, 然后就可以用A接口方法进行调用, 调用时都会经过 MyInvocationHandler.invoke() 方法

如何使用 Java 反射实现动态代理?

如果使用java反射, 则可以使用这样的形式得到代理类

public class MyInvocationHandler implements InvocationHandler {
// 目标对象(需要被代理的对象)
private Object target; public void setTarget(Object target) {
this.target = target;
}
/**
* 执行代理对象的所有方法时都会被替换成执行如下的invoke方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 实例化一个增强类
Extend extend = new Extend();
// 执行增强方法1(模拟spring前置增强)
extend.ExtendMethod1();
Object result = method.invoke(target, args);// 【执行目标方法】
// 执行增强方法2(模拟spring后置增强)
extend.ExtendMethod2();
return result;
}
} public class MyProxyFactory {
/*
* 获取一个目标对象(目标类必须实现接口)的代理对象
*/
public static Object getProxy(Object target) {
// 实例化一个InvocationHandler类, 并传入目标对象
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
myInvocationHandler.setTarget(target);
// 生成代理对象
Object proxyObject = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandler);
return proxyObject;
}
}

Java 接口代理模式的指定增强?

在 InvocationHandler.invoke() 中, 在执行对象方法的前后, 进行额外的操作

谈谈对Cglib 类增强动态代理的实现?

https://blog.csdn.net/yaomingyang/article/details/82762697

CGLIB是一个强大、高性能的字节码生成库, 它用于在运行时扩展Java类和实现接口;本质上它是通过动态的生成一个子类去覆盖所要代理的类(非final修饰的类和方法).

Enhancer是一个非常重要的类, 它允许为非接口类型创建一个JAVA代理, Enhancer动态的创建给定类的子类并且拦截代理类的所有的方法, 和JDK动态代理不一样的是不管是接口还是类它都能正常工作.

  • net.sf.cglib.proxy.Callback接口, 在cglib包中是一个很关键的接口, 所有被net.sf.cglib.proxy.Enhancer类调用的回调(callback)接口都要继承这个接口
  • net.sf.cglib.proxy.MethodInterceptor接口, 是通用的回调(callback)类型, 他经常被AOP用来实现拦截(intercept)方法的调用

一个常见的通过 MethodInterceptor 和 Enhancer 实现的代理实现方式

public class ProxyFactory implements MethodInterceptor {
private Object obj; //要代理的真实对象 public Object createProxy(Object target) {
this.obj = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.obj.getClass()); //设置代理目标
enhancer.setCallback(this); //设置单一回调对象, 在调用中拦截对目标方法的调用
enhancer.setClassLoader(this.obj.getClass().getClassLoader()); //设置类加载器
return enhancer.create();
} /**
* 方法描述 当对基于代理的方法回调时, 在调用原方法之前会调用该方法
* 拦截对目标方法的调用
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object result = null;
try {
before(); //前置通知
result = proxy.invokeSuper(obj, args);
after(); //后置通知
} catch (Exception e) {
exception(); //异常通知
} finally {
beforeReturning(); //方法返回前通知
}
return result;
} private void before() {
System.out.println("before method invoke...");
}
private void after() {
System.out.println("after method invoke...");
}
private void exception() {
System.out.println("exception method invoke...");
}
private void beforeReturning() {
System.out.println("beforeReturning method invoke...");
}
}

讲解JDK 动态代理和 CGLIB 代理原理以及区别?

cglib生成的代理实际上是子类, 可以不需要接口.

Spring专题1: 静态代理和动态代理的更多相关文章

  1. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  2. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  3. spring——AOP(静态代理、动态代理、AOP)

    一.代理模式 代理模式的分类: 静态代理 动态代理 从租房子开始讲起:中介与房东有同一的目标在于租房 1.静态代理 静态代理角色分析: 抽象角色:一般使用接口或者抽象类来实现(这里为租房接口) pub ...

  4. spring静态代理和动态代理

    本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能 ...

  5. spring的静态代理和动态代理

    Java静态代理 Jdk动态代理 java代理模式 即Proxy Pattern,23种java常用设计模式之一.代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问. 原理: 代理模式的主要 ...

  6. Spring 静态代理和动态代理

    现在我们来模拟一下,某位学生去考试. 假设他(小明)正常的考试. 运行结果:        结果: 突然某一天,他睡过头了,来不急去考试,所有他打算叫另一个人(Cheater)去代替他考试. 运行结果 ...

  7. Spring AOP里的静态代理和动态代理,你真的了解嘛?

    什么是代理? 为某一个对象创建一个代理对象,程序不直接用原本的对象,而是由创建的代理对象来控制原对象,通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为 ...

  8. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

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

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

随机推荐

  1. 【LeetCode】976. Largest Perimeter Triangle 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcod ...

  2. 【LeetCode】201. Bitwise AND of Numbers Range 解题报告(Python)

    [LeetCode]201. Bitwise AND of Numbers Range 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/prob ...

  3. Codeforces A. Orchestra

    A. Orchestra time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  4. STC8A,STC8G,STC8H系列的IRC内部振荡源频率调节

    从STC15开始, 宏晶就在内置RC震荡源(内置时脉, 宏晶称之为IRC)这条路上越走越远. STC15这一代仅仅是"有", 精度和漂移差强人意. 从STC8开始对IRC的调节就越 ...

  5. CS5266 Type-C转HDMI+PD3.0+USB3.0 三合一拓展坞电路设计

    CS5266 Type-C转HDMI+PD3.0+USB3.0 三合一拓展坞电路设计 CS5266是一款带PD3.0快充 Type-C转HDMI 4K30HZ音视频转换芯片.CS5266支持PD3.0 ...

  6. Java+Eclipse+MySQL+Swing实现学生会考成绩管理系统(免费完整项目)

    版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.需求开发文档 二.数据库设计文档 三.功能模块部分代码及效果展示 四.完整源码下载 五.作者Info 一.需求开发文档 项目完整文件列表: ...

  7. 基于Spring MVC + Spring + MyBatis的【外包人力资源管理系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/45600390 练习点设计:模糊查询.删除.新增 一.语言和环境 实现语言:JAVA语 ...

  8. 编写Java程序,在子类老虎中重写父类动物的吃食方法

    返回本章节 返回作业目录 需求说明: 在子类老虎中重写父类动物的吃食方法 实现思路: 在子类老虎中重写父类动物的吃食方法的实现思路如下: 创建各种动物的父类Animal类,在该类中定义eat()方法. ...

  9. CSS基础6之盒子模型1

    盒子概述 以下是盒子模型的一个图形解释 一.内边距(填充) 属性有: (1) padding  设置所有内边距 (2) padding-top  设置上边距 (3) padding-left 设置左边 ...

  10. oracle 之 数组、嵌套表、SQL查询式 实现多表数据for循环插入指定表

    1.基础环境 创建基础表: CREATE TABLE TEST_TAB1( ID INT, NAME VARCHAR2(20) ); CREATE TABLE TEST_TAB2( ID INT, N ...