Spring学习笔记(14)----使用CGLIB实现AOP功能

好久没学习spring了,今天接着学习。

接着这上面的例子,在上面的例子中我们的UserManagerImpl类是实现了UserManager接口,如果UserManagerImpl没有实现任何接口要怎么办呢?应为创建代理对象时我们需要指定接口的。

Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
									  targetObject.getClass().getInterfaces(),
									  this);

 

由于没有时间接口,因此我们是不能这样创建代理接口的,这是我们需要借助第三方包来实现。在spring中提供了cglib-nodep-2.1_3.jar包。我们通过cglib创建代理对象。

下面就通过实例演示通过cglib创建代理对象。

 

首先创建CGlibProxyFactory,实现MethodInterceptor接口,接口中有一个intercept方法,当代理对象的方法被调用时会调用这个方法。

package com.szy.spring;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


public class CGlibProxyFactory implements MethodInterceptor
{
	private Object targetObject;
	
	public Object newProxy(Object targetObject)
	{
		this.targetObject=targetObject;
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());
		enhancer.setCallback(this);
		//返回代理对象
		return enhancer.create();
	}

	/**
	 * proxy        带来对象本身
	 * method       被拦截到的方法
	 * args          方法的参数
	 * methodProxy  方法的代理对象
	 */
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable
	{
		checkSecurity();
		Object ret=null;
		try
		{
			//调用目标对象的真实方法
			ret=method.invoke(this.targetObject, args);
			//ret接受存在的返回值,不存在返回值则为Null
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return ret;
	}
	public void checkSecurity()
	{
		System.out.println("--------UserManagerImpl.checkSecurity()----------");
	}
}

 

其实整个代码很前面的很相似,只是创建代理对象的方法不一样。

测试代码:

CGlibProxyFactory factory=new CGlibProxyFactory();
		//创建代理对象,这是这个代理对象是UserManagerImpl的子类
		UserManagerImpl userManager=(UserManagerImpl)factory.newProxy(new UserManagerImpl());
		userManager.addUser("coolszy", "kuka");

 

上面演示的几个事例是不借助与任何框架的情况下实现AOP的方法。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值