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。


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

<think>好的,我现在需要帮用户查找关于AOP代理模式的示意图。首先,用户提到了AOP代理模式,特别是Spring AOP使用的JDK动态代理和CGLIB代理。根据用户提供的引用内容,我需要整理这些信息,并生成相关的示意图描述。 首先,用户提供的引用[1]提到,Spring AOP默认使用JDK动态代理,当目标对象没有实现接口时则使用CGLIB。引用[4]解释了切面将公共行为封装成模块。用户需要的是示意图,所以可能需要用文字描述结构图,比如类、代理对象、方法调用流程等。 接下来,我需要确定如何将代理模式的结构可视化。通常,AOP代理会在目标对象的方法调用前后插入切面逻辑,如日志、事务等。示意图可能包括客户端调用代理对象,代理对象调用目标对象的方法,并在适当时机应用通知(Advice)。 另外,引用[2]和[3]提到AOP与OOP的区别以及切面类的配置,这些可能需要在示意图中体现,比如显示切面类如何横切多个业务类。不过用户主要关注代理模式,所以重点应放在代理的结构上。 可能的结构包括:客户端、代理对象、目标对象、切面(Advice)。在JDK动态代理中,代理对象实现接口,而CGLIB代理则继承目标类。需要说明两者的区别,并指出何时使用哪一种。 需要注意用户无法查看图片,所以需要用文字详细描述示意图的各个部分,比如用方框表示组件,箭头表示调用关系,并标注步骤。例如,代理对象拦截方法调用,执行前置通知,调用目标方法,执行后置通知等。 最后,根据用户的要求生成相关问题,需要围绕代理模式动态代理与CGLIB的区别、应用场景等展开。确保问题与用户查询相关,并帮助深化理解。</think>### AOP代理模式示意图解析 在AOP中,代理模式是实现切面逻辑织入的核心机制。以下是代理模式的结构描述(以Spring AOP为例): **1. 代理模式示意图核心组件** ``` [客户端] --> [代理对象] --> [目标对象] ↑ | 调用前后织入 [切面(Advice)] ``` - **客户端**:发起方法调用的业务代码,例如调用`UserService.save()`。 - **代理对象**:由AOP框架动态生成的类,拦截目标方法并在适当时机触发切面逻辑。 - **目标对象**:实际执行业务逻辑的原始对象(如`UserServiceImpl`)。 - **切面(Advice)**:包含横切关注点的代码(如日志、事务等)。 **2. 动态代理类型对比** - **JDK动态代理** ![JDK动态代理] 要求目标对象**实现接口**,代理对象通过`InvocationHandler`拦截接口方法调用,并在方法执行前后插入切面逻辑[^1]。 - **CGLIB代理** ![CGLIB代理] 通过**继承目标类**生成子类代理,覆盖父类方法实现拦截,适用于未实现接口的类。 **3. 方法调用流程示例** ``` 1. 客户端调用代理对象的方法(如`save()`) 2. 代理对象触发前置通知(@Before) 3. 代理对象调用目标对象的实际方法 4. 代理对象触发后置通知(@After) 5. 返回结果给客户端 ``` ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值