Spring AOP 学习之cglib动态代理
cglib动态代理,首先需要导入包:cglib-nodep-2.1_3.jar 然后基本的写法与相同。 只是在代理类有些不一样。
package com.yc.advice;
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 RightAdvice implements MethodInterceptor {
//代理模式中一定要有目标类的引用
private Object targetObject; //注意,这个就是目标类的引用
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy arg3) throws Throwable {
String methodName=method.getName();
if( methodName.startsWith("add") || methodName.startsWith("del")|| methodName.startsWith("update") || methodName.startsWith("modify") ){
//在invoke中加入您要增强的代码
check(); //前置增强
}
//调用目标的对应的方法
Object returnValue=method.invoke(targetObject, args); // object is not an instance of declaring class
return returnValue;
}
//创建一个方法来完成创建代理对象
public Object createInstance( Object targetObject ){
this.targetObject=targetObject; // => Object
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass( targetObject.getClass() );
//enhancer.setClassLoader( targetObject.getClass().getClassLoader() );
enhancer.setCallback( this );
return enhancer.create(); //创建代理类对象.
}
//增强
private void check(){
System.out.println("***********************************");
System.out.println("权限检查");
System.out.println("***********************************");
}
}
