快捷搜索: 王者荣耀 脱发

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("***********************************");
	}

}
经验分享 程序员 微信小程序 职场和发展