Cglib动态代理除了可以实现接口方法的增强亦可以实现非接口方法的增强
package com.bdqn.AOP02.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @author Guo
* @create 2021-12-31 10:55
* cglib动态代理
* 实现类非接口的方法 cglib依然可以增强
*/
public class MyCglibProxy implements MethodInterceptor {/*实现方法拦截器接口基于(org.springframework.cglib.proxy.MethodInterceptor)包*/
private UserDao dao;
/**
* 注入需要代理的对象
*
* @param dao
*/
public MyCglibProxy(UserDao dao) {
this.dao = dao;
}
/**
* 创建动态代理对象
*
* @return
*/
public Object createProxy() {
//创建核心类 关键词:Enhancer(增强器)基于(org.springframework.cglib.proxy.Enhancer)包下的对象
Enhancer enhancer = new Enhancer();
//目标对象设置父类
enhancer.setSuperclass(dao.getClass());
//设置回调 调用重写的处理调用方法
enhancer.setCallback(this);
//生成代理对象
Object proxy = enhancer.create();
return proxy;
}
/**
* 处理调用方法
*
* @param proxy 代理对象
* @param method 对象方法
* @param args 方法参数
* @param methodProxy 方法代理对象
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//判断指定的方法是否进行增强
if ("update".equals(method.getName())) {
System.out.println("权限验证----------");
return methodProxy.invokeSuper(proxy, args);
}
//非接口的方法进行增强
if ("a".equals(method.getName())) {
System.out.println("调用a的增强------------");
return methodProxy.invokeSuper(proxy, args);
}
return methodProxy.invokeSuper(proxy, args);
}
}