使用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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值