java 代理实现方式

先讲一下概念,代理,什么是代理?

举个例子吧。很多人喜欢在淘宝或者天猫上淘一些生活用品或者衣服,这个购买过程就产生了本文的重点,代理。你知道你购买的商家叫什么名,但是不知道他后面的厂家是谁?这件衣服是哪个厂家卖给了你,你完全不知道,其实这个过程就是代理,厂家委托商家卖衣服给你,商家就是代理类,代理卖这个厂家这个品牌的衣服,厂家就是委托类,委托商家埋衣服。什么北京区代理,黑龙江总代理,都是这个方式的。

代理分为动态,和静态。先说说静态代理,

//代理接口类

public interface SpiderOrder {

//订单1

public void crawlingSpider1();

//订单2

public void crawlingSpider();

}

//委托类

public class SpiderOrderImpl implements SpiderOrder{

@Override

public void crawlingSpider1() {

// TODO Auto-generated method stub

System.out.println("订单1-----");

}

@Override

public void crawlingSpider() {

// TODO Auto-generated method stub

System.out.println("订单2-----");

}

}

//静态代理类

public class SpiderOrderProxy implements SpiderOrder{

private SpiderOrderImpl spiderOrderImpl;

public SpiderOrderProxy(SpiderOrderImpl spiderOrderImpl) {

super();

this.spiderOrderImpl = spiderOrderImpl;

}

@Override

public void crawlingSpider1() {

// TODO Auto-generated method stub

spiderOrderImpl.crawlingSpider1();

System.out.println("具体的执行");

}

@Override

public void crawlingSpider() {

// TODO Auto-generated method stub

spiderOrderImpl.crawlingSpider();

System.out.println("具体的执行");

}

}

说明:你看这个静态代理有啥缺点吗? 代理接口新增一个方法,实现类要全都实现,静态代理类也要全部都实现这个新增方法。你这接口方法少还行,项目大了,经常会变动的。还有就是这个你知道哪个类是代理类,可以直接去用,事先是知道的。如果不知道呢具体的代理类,如何呢?接下来讲解动态代理类。

动态代理,利用了很多反射的技术知识,开始

//中介类

public class WorkInvocationHandler implements InvocationHandler{

private Object object;//代理类持有一个委托类对象

public WorkInvocationHandler(Object object) {

super();

this.object = object;

}

@Override

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

System.out.println(" 方法调用之前 ");

method.invoke(object, args);

System.out.println(" 方法调用之后 ");

return null;

}

}

中介类必须实现InvoCationhandler类,来处理。当我们调用代理的具体的方法的时候,会统一的到中介类的invoke方法上,这样我们可以在invoke方法上做具体的逻辑,根据不同的情况做不同的处理,参数Method是方法,proxy是具体的代理类。这个中介类的输出是在这个代理类具体实现方法前,和方法后做具体的处理。

public class InvokeClient {

public static void main(String[] args) {

SpiderOrder spidOrder = new SpiderOrderImpl();

InvocationHandler invocation = new WorkInvocationHandler(spidOrder);

SpiderOrder proxySipderOrder = (SpiderOrder) Proxy.newProxyInstance(invocation.getClass().getClassLoader(), spidOrder.getClass().getInterfaces(), invocation);

System.out.println("输出这个反射出来的proxySipderOrder" + proxySipderOrder.getClass().getName());

//这实际上回调用到

proxySipderOrder.crawlingSpider();

proxySipderOrder.crawlingSpider1();

}

}

会发现,中介类与代理类也构成了一个静态代理关系,这个关系中,中介类是委托类,代理类是代理类。这样做的好处就是将代理类与被代理对象分离开来,这样我们可以在代理类与被代理类随意组合。也就是说动态代理是由两组静态代理构成的,这也基本是原理了。自己品味一下这个JDK动态代理。

spring AOP是基本原理是动态代理,分为jdk的动态代理,和CGLIB代理组成。

时间: 2024-10-25 20:46:15

java 代理实现方式的相关文章

java 代理的三种实现方式

Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public interface Greeting { public void doGreet(); } 实现类: public class SayHello implements Greeting { @Override public void doGreet() { System.out.println("

Java动态代理实现方式一

Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Java动态代理实现方式二:CGLIB 用CGLIB实现Java动态代理的局限性 面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问“茴香豆的茴字有哪几种写法? 所谓代理模式,是指客户端(Client)并不直接调用实际的对象(下图右下角

Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法

为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者研读源码. 我们知道,使用Mybatis的方式有很多种,从是否集成上分,可以单独使用,也可以和Spring集成使用:从使用方式上分,可以编写静态工具类,在静态工具中调用SqlSession,也可以直接注入SqlSession/ SqlSessionTemplate,还可以编写Dao接口,让mybat

Java代理(Aop实现的原理)

经过大牛同事的一句指点立刻明白的代理实现方式,Spring Aop应该也是这么去做的.直接上代码 实现在Car的run方法之前调用star方法,在run方法之后调用stop方法. Car类 package com.lubby.test; public class Car { public void run() { System.out.println("I am running...."); } } Car的run方法之前和之后调用的方法 package com.lubby.test;

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

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

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象

【java代理】动态代理

java代理机制 Table of Contents 1 引言 2 常见的代理 3 代理模式UML图 4 代理模式实例 5 java动态代理 5.1 java动态代理UML图 6 代理模式与装饰者模式的区别 6.1 装饰者模式UML图 6.2 形象说明 1 引言 我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性代码之外,它下是函数的目的,这是对O

java 代理模式(静态代理、动态代理、Cglib代理) 转载

Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调

Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Client)并不直接调用实际的对象(下图右下角的RealSubject),而是通过调用代理(Proxy),来间接的调用实际的对象. 代理模式的使用场合,一般是由于客户端不想直接访问实际对象,或者访问实际的对象存在技术上的障碍,因而通过代理对象作为桥梁,来完成间接访问. 实现方式一:静态代理 开发一个接口IDev