一、CGLIB本质
- 没有接口,只有实现类
- 采用字节码字节码增强框架cglib,在运行时,创建目标类的子类,从而对目标类进行增强
- 导包
二、示例代码
目标类
public class UserServiceImpl {
public void addUser() {
System.out.println("com.itheima.a_proxy.b_cglib addUser");
}
public void updateUser() {
System.out.println("com.itheima.a_proxy.b_cglib updateUser");
}
public void deleteUser() {
System.out.println("com.itheima.a_proxy.b_cglibs deleteUser");
}
}
切面类
public class MyAspect {
public void before() {
System.out.println("before");
}
public void after() {
System.out.println("after");
}
}
工厂类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class MyBeanFactory {
public static UserServiceImpl createService() {
//1.目标类
UserServiceImpl userService=new UserServiceImpl();
//2.切面类
MyAspect myAspect=new MyAspect();
/*3.代理类,采用cglib,底层创建目标类的子类
*
*
*/
//3.1 核心类
Enhancer enhancer = new Enhancer();
//3.2确定父类
enhancer.setSuperclass(userService.getClass());
/* 3.3设置回调函数,MethodInterceptor接口等效jdk InvocationHandler接口
* intercept()等效jdk invoke()
* 参数1、2、3与invoke一样
* 参数4:methodProxy 方法代理,此下面方法代理内容就是执行父类的方法
*/
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
//前执行方法
myAspect.before();
//执行目标类的方法
Object obj = method.invoke(userService, args);
//执行代理类的父类,执行目标类(目标类和代理类 父子关系)相当于上一句代码
methodProxy.invokeSuper(proxy, args);
//后执行方法
myAspect.after();
return null;
}
});
//3.4 创建代理
UserServiceImpl poxyService =(UserServiceImpl)enhancer.create();
return poxyService;
}
}
测试类
import org.junit.Test;
public class TestCglib {
@Test
public void demo1(){
UserServiceImpl userService = MyBeanFactory.createService();
userService.addUser();
userService.updateUser();
userService.deleteUser();
}
}