1.基于jdk的动态代理
@Test
public void test03(){//基于jdk的动态代理
//原始类
UserServiceImpl userService = new UserServiceImpl();
/*
* ClassLoader :类加载器 java程序执行 编写源码 .java->编译 .class ----类加载器----jvm执行
* jvm 会针对每一个class文件 分配一个 classLoader
* 作用 1.加载class文件 到jvm
* 2.生产该文件对应的Class对象(类对象) 从而创建实体类对象
* 代理类 不会被分配类加载器 但是可以借用其他类的加载器 实现程序的运行
* interfaces : 原始类实现的接口
* invocationHandler :额外的功能
* */
InvocationHandler invocationHandler=new InvocationHandler(){
/*
* Object proxy : 代表生成的代理对象
* Method method : 原始类中被调用的方法
* Object[] args : 调用方法的参数列表
* 返回值Object :原始方法的返回值
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("------jdk log-----");
//调用原始类的方法
Object invoke = method.invoke(userService, args);
return invoke;
}
};
//创建动态代理对象 userService $proxy
UserService userService1 = (UserService) Proxy.newProxyInstance(TestProxy.class.getClassLoader(), userService.getClass().getInterfaces(), invocationHandler);
// System.out.println("userService1 = " + userService1);
User user = User.builder().password("123445").username("tom").build();
//invoke
userService1.add(user);
}
2.基于cglib的动态代理
@Test
public void test04(){ //基于cglib的动态代理 基于父子关系 创建代理对象
UserServiceImpl2 userServiceImpl2 = new UserServiceImpl2();
//Enhancer 它是一个字节码增强器,可以用来为无接口的类创建代理
Enhancer enhancer = new Enhancer();
//设置相关参数
enhancer.setClassLoader(this.getClass().getClassLoader());
enhancer.setSuperclass(userServiceImpl2.getClass());
//callback增强业务 类似jdk中的invoke方法
MethodInterceptor methodInterceptor = new MethodInterceptor(){
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("---------cglib------");
Object invoke = method.invoke(userServiceImpl2, objects);
return invoke;
}
};
enhancer.setCallback(methodInterceptor);
//通过enhancer 创建代理对象
UserServiceImpl2 userServiceImpl =(UserServiceImpl2) enhancer.create();
User user = User.builder().password("123445").username("tom").build();
userServiceImpl.add(user);
}