Cglib代理

JDK动态代理存在局限性,使用动态代理的对象必须实现一个或多个接口。而很多情况下,我们的类并没有实现接口,所以需要Cglib代理。

CGLIB (Code Generation Library)是-一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。

代码如下:

UserDao.java

package com.itheima.cglib;

public class UserDao {
public void addUser(){
System.out.println("添加用户");
}
public void deleteUser(){
System.out.println("删除用户");
}
}


CglibProxy.java

package com.itheima.cglib;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import com.itheima.aspect.MyAspect;

public class CglibProxy implements MethodInterceptor {
//代理方法
public Object createProxy(Object target){
//创建一个动态类对象
Enhancer enhancer = new Enhancer();
//确定需要增强的类,设置其父类
enhancer.setSuperclass(target.getClass());
//添加回调函数
enhancer.setCallback(this);
//返回创建的代理类
return enhancer.create();
}

//proxy CGlib根据指定父类生成的代理对象
//method拦截的方法
//args拦截的方法的数组
//methodProxy方法的代理对象,用于执行父类方法
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
//创建切面对象
MyAspect myAspect = new MyAspect();
//前增强
myAspect.check_Permissions();
//目标方法执行
Object obj=arg3.invokeSuper(arg0, arg2);
//后增强
myAspect.log();
return obj;
}

}


CglibTest.java

package com.itheima.cglib;

public class CglibTest {

public static void main(String[] args) {
// 创建代理对象
CglibProxy cglibProxy = new CglibProxy();
//创建目标对象
UserDao userDao = new UserDao();
//获取增强后的目标对象
UserDao userDao1 =(UserDao) cglibProxy.createProxy(userDao);
//执行方法
userDao1.addUser();
userDao1.deleteUser();

}

}

posted @ 2020-07-20 16:00  南巷北口  阅读(171)  评论(0)    收藏  举报