首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

使用CGLib实现Aop的效能

2013-09-24 
使用CGLib实现Aop的功能1、模拟Aop拦截所有类方法2、判断用户是否有权限,有权限就允许操作该类方法,没有权限

使用CGLib实现Aop的功能
1、模拟Aop拦截所有类方法
2、判断用户是否有权限,有权限就允许操作该类方法,没有权限不允许操作该类方法
(只是一个模拟,根据用户名是否为null判断是否有权限)

使用CGLib,CGLib和proxy不同,类可以不用实现接口  需要导入cglib-bodep-2.1.3.jar包
下载地址:http://ishare.iask.sina.com.cn/f/13433574.html
如果导入cglib-2.2.jar或者cglib-2.1.3.jar是会报这个异常Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type

下载给一个demo,已经测试通过
步骤:
1、先写好业务类型
实现类的代码
package cn.tuletech.service.impl;

public class TeacherServiceBean {
private String username = null ;
public TeacherServiceBean(){}

public String getUsername() {
return username;
}

public TeacherServiceBean(String username){
this.username = username;
}

public void teach(){
System.out.println("老师在教书");
}

public void getTeach(){
System.out.println(this.username);
System.out.println("获取教师");
}
}
2、编写CGLib工厂
package cn.tuletech.util;

import java.lang.reflect.Method;

import cn.tuletech.service.impl.TeacherServiceBean;

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

public class CGLibFactory implements MethodInterceptor{
public Object targetObject;
/**
*
* @param targetObject 目标对象
* @return Object  创建代理对象
*/
public Object createCGLibObject(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());//需要设置this.targetObject的父类,创建this.targetObject的子类会覆盖this.targetObject中所有非final修饰的方法
enhancer.setCallback(this);//设置回调
return enhancer.create();//创建代理对象

}
/**
*当类中的方法被调用可以回调这个方法
*@param object 代理对象本身
*@param method 代理对象的方法
*@param args   代理对象方法参数输入
*@param methodProxy   方法的代理对象
/
@Override
public Object intercept(Object object, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
TeacherServiceBean service = (TeacherServiceBean)this.targetObject;
Object result = null;
if(service.getUsername()!=null){
result = methodProxy.invoke(this.targetObject, args);//把对象和方法
}
return null;
}
}

热点排行