AOP之代理模式(三)

JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 。如果想代理没有实现接口的类可以使用CGLIB包。先来看看GCLIB的具体使用,然后再对应代码深入理解。

在使用CGLIB时需引入cglib-nodep-2.1_3.jar包。

先来一个基础类,注意,这里没有对应的接口。

public class GreetingImpl {

	public void sayHello(String name) {
		System.out.println("Hello! " + name);
	}
}

然后就是咱们定义的动态代理类

package com.tgb.sld.cglibproxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * CGLib动态代理类
 *
 * @author sunliduan 2015年5月26日 下午3:32:38
 */
public class CGLibDynamicProxy implements MethodInterceptor {

	// 定义被代理的对象
	private Object target;

	// 根据被代理对象,创建代理类
	public Object createProxy(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());// 设置代理目标
		enhancer.setCallback(this);// 设置回调
		enhancer.setClassLoader(target.getClass().getClassLoader());
		return enhancer.create();
	}

	// 通过代理类调用被代理类的方法或者特殊处理(如切入方法)
	@Override
	 public Object intercept(Object proxy, Method method, Object[] params,
	            MethodProxy methodProxy) throws Throwable {
		before();
		Object object= methodProxy.invoke(target, params);
		after();
		return object;
	}

	private void before() {
		System.out.println("Before==通过CGLib动态代理把我加到被切方法之前");
	}

	private void after() {
		System.out.println("After==通过CGLib动态代理把我加到被切方法之后");
	}

}

其实在代理类中和JDK动态代理实现的功能或者是原理来说,是很类似的:首先定义一个Object类型的被代理对象;然后根据被代理对象,创建代理类;最后通过代理类调用被代理类的方法或者特殊处理(如切入方法)。

客户端的调用代码如下:

<span style="font-size:18px;">package com.tgb.sld.cglibproxy;

public class Client {

	public static void main(String[] args) {

		CGLibDynamicProxy cgLibDynamicProxy=new CGLibDynamicProxy();
		GreetingImpl greetingImpl= (GreetingImpl) cgLibDynamicProxy.createProxy(new GreetingImpl());

		greetingImpl.sayHello("duanduan");

	}

}</span>

这样,我们基本上解决了JDK动态代理的局限-不能代理没有对应接口的类。CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架,具体是什么大家可以上网查一查,cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。

这样算是完美了,当然不是的,不知道大家有没有注意,在我们每个代理类中,我们都需要重新写一篇切入的方法,这样显然不能实现很好的复用。为了解决这个问题,我们又该如何完善呢?

时间: 2024-10-06 02:47:55

AOP之代理模式(三)的相关文章

设计模式之代理模式 (三)

代理模式也叫委托模式. 一.定义: 代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信. 二.角色定义 抽象角色:声明真实对象和代理对象的共同接口: 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象

AOP之代理模式(一)

AOP,为Aspect OrientedProgramming的缩写,意为:面向切面,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 说了一堆很官方的话,大家可能不是特别明白,不过这些算是我们实践的理论寄出去,还是很有必要知道的,但是现在不必要很懂,接下来从最简单的代码开始,一步步的慢慢深入了解,到底什么是AOP,什么是代理模式.学习,就是这样一个理论与

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

AOP基础—代理模式

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行

反射实现AOP动态代理模式(Spring AOP实现原理)

其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决问题的方法中的共同点,是对OO思想的一种补充! 还是拿人家经常举的一个例子讲解一下吧: 比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录. 我们写个例子看看我们最简单的解决方案 我们先写一个接口IHello.java代码如下: package sinosoft.dj.aop.st

AOP之代理模式(二)

上篇博文介绍的静态代理有一个最主要的缺点:每个业务类,必须有一个代理类.这样在程序中就会出现很多个代理类,这样的代码还是有坏味道的.这篇文章就为了解决这个问题而来--JDK动态代理. 先来看一看最基本的业务接口和业务类: <span style="font-size:18px;">/** * 业务接口类 * @author sunliduan * */ public interface Greeting { void sayHello(String name); }<

代理模式——用AOP测试业务层方法的执行时间

代理模式 对代理模式的理解,通过http://www.runoob.com/design-pattern/proxy-pattern.html 对AOP的代理模式,参考https://www.cnblogs.com/xujiming/p/5737531.html 目标:测试service层每一个方法的执行时间: 代理模式的本质:将被代理对象注入给代理对象,当调用代理对象时,实际上,是在调用被注入的被代理对象 理解: 代理对象 被代理对象 代理类 被代理对象 商家 厂商 房屋中介 房东 静态代理:

Java的代理模式

最近在学习Spring,关于Spring AOP的代理模式不是很了解,看了一篇博文就懂了. https://www.cnblogs.com/cenyu/p/6289209.html Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方

23种设计模式----------代理模式(二)

(上一篇)23种设计模式----------代理模式(一) 之前说了基本的代理模式和普通代理模式.接下来开始看下强制代理模式和虚拟代理模式 三,强制代理模式: 一般的代理模式都是通过代理类找到被代理的对象,从而调用被代理类中的方法(即完成被代理类中的任务). 而,强制代理模式则是先找到被代理类自己去完成事情,然后被代理类又将该做的事情转交到代理类中,让代理类来完成. 假如:你有事求助于某位名人. 你告诉名人说有事想请他帮忙,然后他说最近一段时间比较忙,要不你找我的经纪人来办吧. (本来找名人办事