使用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;
}
}