动态代理

代理模式&动态代理

折月煮酒 提交于 2020-03-02 08:20:10
动态代理的用途: 动态代理的用途与装饰模式很相似,就是为了对某个对象进行增强。所有使用装饰者模式的案例都可以使用动态代理来替换,动态代理可以更好的解耦合 增强有3个手段 1. 继承 被增强对象不能变 增强内容不能变 2. 装饰者模式 被增强对象可变 但增强内容不能变 3. 动态代理 被增强对象可变 增强内容也可变 如何实现动态代理? 定义一个接口Interface, 被增强的对象的类都会实现这个接口 public interface Interface { public void fun(); } 实现这个Interface接口: 而这个InterfaceImpl就是动态代理中被增强的内容 public class InterfaceImpl implements Interface { @Override public void fun() { System.out.println("目标方法调用"); } } 定义一个接口Advice, 增强内容的类都会实现这个接口 这个接口有两个未实现的方法: before()前置增强的方法 after()后置增强的方法 public interface Advice { public void before(); public void after(); } 而实现了Advice接口的对象就是动态代理中增强内容 JavaAPI: java

Java动态代理与CGLIB

北城余情 提交于 2020-03-02 03:07:09
1. 静态代理模式 因为需要对一些函数进行二次处理,或是某些函数不让外界知道时,可以使用代理模式,通过访问第三方,间接访问原函数的方式,达到以上目的,来看一下代理模式的类图: interface Hosee{ String sayhi(); } class Hoseeimpl implements Hosee{ @Override public String sayhi() { return "Welcome oschina hosee's blog"; } } class HoseeProxy implements Hosee{ Hosee h; public HoseeProxy(Hosee h) { this.h = h; } @Override public String sayhi() { System.out.println("I'm proxy!"); return h.sayhi(); } } public class StaticProxy { public static void main(String[] args) { Hoseeimpl h = new Hoseeimpl(); HoseeProxy hp = new HoseeProxy(h); System.out.println(hp.sayhi()); } } 1.1 静态代理的弊端

静态代理与动态代理实现与原理

爷,独闯天下 提交于 2020-03-02 02:32:59
基础代码准备 接口类: public interface IUser { /** * 判断用户的权限 * @param uid 用户的UID * @return */ public boolean isAuthUser(int uid); } 实现类: /** * 类的实现 * @author Jason * */ public class UserImpl implements IUser { @Override public boolean isAuthUser(int uid) { //做一些权限验证的工作 System.out.println(uid); //.... return false; } } 静态代理 由程序员创建或特定工具自动生成源代码,再对其编译,在程序运行前,代理类的.class文件就已经存在了。 原理: 对普通一个接口与一直实现类在加入一个代理类,用于包装实现类中实现的方法,而业务使用方只需要实例化代理类,并传递需要代理的普通类即可。 优点: 编译时生成代码,性能高 缺点: 一个代理类只能为一个接口服务,开发中必然会产生过多的代理 所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码 代码示例 代理类 /** * 通过代理类,实现代理接口,通过构造进行实现的代理,在每个方法里面进行日志捕获 * <pre> *

JDK动态代理使用实例

核能气质少年 提交于 2020-03-01 14:31:26
1. 创建业务接口,包含着业务对外可以提供的功能,也就包含着被代理的内容。 public interface Userservice { /** * 目标方法 */ public abstract void add(); } 2.创建业务接口实现类 public class UserServiceImpl implements Userservice { public void add() { System.out.println("---------add-----------"); } } 3.创建自定义InvocationHandler,用于对接口提供的方法进行增强。 public class MyInvocationHandle implements InvocationHandler { /** * 持有目标对象 */ private Object target; /** * 构造方法 * @param target */ public MyInvocationHandle(Object target) { super(); this.target = target; } /** * 执行目标的方法 * @param proxy * @param method * @param args * @return * @throws Throwable */ public

Spring AOP动态代理-通知

时光毁灭记忆、已成空白 提交于 2020-03-01 03:50:29
在上一篇中,我们用JDK动态代理和CgLib实现了例子中的业务逻辑。那么如果用Spring,如何实现呢? 上一篇: http://my.oschina.net/lfy2008/blog/663999 我们依然有上一章的原材料: 业务逻辑接口:TakingTrain 实现类:TakingTrainImpl 增强的横切逻辑:CheckTicket spring中的相关概念 增强的横切逻辑:Advice 增强类型可以分为: 前置增强:BeforeAdvice 后置增强:AfterRunningAdvice 环绕增强:MethodInterceptor 异常抛出增强:ThrowsAdvice(哈哈,现在是不是可以自己用它来控制事物) 引介增强:IntroductionInterceptor CheckTicket的改造: 我们知道,CheckTicket中的方法调是在在TakingTrain的方法之前。那么,我们可以让CheckTicket实现前置增强的接口: public class CheckTicketAdvice implements MethodBeforeAdvice{ @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out

java反射与代理

馋奶兔 提交于 2020-02-29 07:52:21
Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC、AOP就是通过反射机制与动态代理实现的。 1 Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod(),或者遍历修改可访问性 Method method = cls.getMethod("getTime5Flag"); String res1 = (String) method.invoke(user); System.out.println(res1); //涉及到基本类型如int,则使用int.class!Integer.class!=int.class! method = cls.getMethod("setTime5Flag", String.class); method.invoke(user, "Rollen"); method = cls.getMethod("getTime5Flag"); String res2 = (String) method.invoke(user); System.out.println(res2);

Spring Proxy 动态代理(ProxyFactory)

二次信任 提交于 2020-02-28 23:47:32
一、动态代理生成技术栈分为两种: 1、JDK动态代理 JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib动态代理 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承) 二、Spring在选择用JDK还是CGLiB的依据: (1)当Bean实现接口时,Spring就会用JDK的动态代理 (2)当Bean没有实现接口时,Spring使用CGlib是实现 (3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>) 三、CGlib比JDK快?   (1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。   (2)在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,JDK7及8的动态代理性能比CGlib要好20%左右。 四、Spring 动态代理如何封装的; 来源: https://www.cnblogs.com/wangwei1986/p/9377504.html

装饰者模式与代理模式的差异

柔情痞子 提交于 2020-02-28 10:59:04
前言 在还没毕业的去面试的时候,被问到动态代理与策略模式有什么区别,当时想了想也没想出来什么合适的回答,最会草草越过,之后面试完毕进行了相关的查阅,还是懵懵懂懂的,到现在debug SpringMVC源码的时候,遇到 initHandlerAdapters 初始化的后,一直纠结此处是使用了责任链模式还是策略模式,然后就想到了之前遇到的动态代理和装饰者模式。 来源: oschina 链接: https://my.oschina.net/u/2555967/blog/3156190

java jdk动态代理模式举例浅析

柔情痞子 提交于 2020-02-27 10:30:37
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色。 java中常用的动态代理模式为jdk动态代理和cglib动态代理。 反射技术 了解动态代理之前,需要先了解一下java中的反射,反射在框架中的应用非常广泛,它能够配置:类的全限定名,方法和参数。在运行时,动态的完成类的初始化,或者反射调用某些方法。 我们可以通过Class.forName()方法加载类,并用getConstructor方法配置参数。例: object = (goodsServiceImpl)=Class.forName("com.xjx.test.goodsServiceImpl").getConstructor(String.class).newInstance("计算机"); 1. jdk动态代理举例 jdk动态代理由java.lang.reflect.*包提供,它 必须借助一个接口 才能实现代理。 我们举个例子来实现jdk动态代理并简要分析: 首先我们定义一个接口: public interface jdkProxy { public void test(String tString); } 以及它的实现类: public class jdkProxyImpl implements jdkProxy{

Spring Boot的动态代理AOP原理

只愿长相守 提交于 2020-02-27 08:13:41
前言 Spring AOP使用了动态代理技术,动态代理在业界比较流行的实现方式有,CGLIB,Javassist,ASM等等。 Spring动态代理实现方式 Spring采用了JDK和CGLIB两种方式,我们一般都是接口,配实现类,对应这种方式Spring采用的代理方式是JDK代理,如果实现类没有使用接口,就一个实现类的话就采用CGLIB代理。 个人微信公众,经常更新一些实用的干货: 来源: oschina 链接: https://my.oschina.net/u/4115084/blog/3164110