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

来源:互联网 发布:网络维护做点什么 编辑:程序博客网 时间:2024/05/01 20:38

好久没学习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的方法。 

  • 14_使用CGLIB实现AOP功能.rar (289 KB)
  • 下载次数: 42
0 0
原创粉丝点击