jdk动态代理和cglib代理

80 阅读1分钟

基础

  • cglib代理:适合代理的类没有实现接口,通过继承实现,Enhancer创建代理类
  • jdk代理:适合代理的类实现了接口,通过Proxy类和InvocationHandler接口实现

jdk动态代理

  • 接口

    public interface MemberService {
        public String say();
    }
    
  • 要代理的对象

    public class MemberServiceImpl implements MemberService{
        @Override
        public String say() {
            return "你好";
        }
    }
    
  • 代理实现

    public class Main {
        public static void main(String[] args) {
            MemberServiceImpl bean = new MemberServiceImpl();
            
            MemberService memberService = (MemberService)Proxy.newProxyInstance(MemberServiceImpl.class.getClassLoader(), MemberServiceImpl.class.getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("切面逻辑");
                    return method.invoke(bean, args);
                }
            });
    
            System.out.println(memberService.say());
        }
    }
    

cglib代理

  • 被代理的对象

    public class UserService {
        public void addUser(String username) {
            System.out.println("添加用户: " + username);
        }
    }
    
  • 创建方法拦截器

    public class UserServiceInterceptor implements MethodInterceptor {
        /**
         * @param obj         代理对象(CGLIB 生成的子类实例)
         * @param method      目标方法(如 addUser)
         * @param args        方法参数
         * @param proxy       方法代理
         */
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("方法调用前: " + method.getName());
            Object result = proxy.invokeSuper(obj, args); // 调用原始方法
            System.out.println("方法调用后: " + method.getName());
    
            return result;
        }
    }
    
  • 通过Enhancer获取代理对象

    public class Demo {
        public static void main(String[] args) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(UserService.class);
    
            // 设置回调(方法拦截器)
            enhancer.setCallback(new UserServiceInterceptor());
    
            // 创建代理对象
            UserService userService = (UserService) enhancer.create();
    
            // 调用代理方法
            userService.addUser("张三");
        }
    }