CGLB实现动态代理

示例背景:现有addUser方法,我们用动态代理给该方法增加校验:添加用户时姓名长度少于2报错。

1.实体类

package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;

public class User {

    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.业务类:无需实现接口

package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;


public class UserServiceImpl{

    public void addUser(User user) {
        System.out.println("用户添加成功····");
    }
}

3.写一个类实现MethodInterceptor 接口,在重写的intercept方法中编写增强的代码;

package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;


import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class UserServiceInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
            throws Throwable {
        if (objects[0] instanceof User){
            User u  = (User)objects[0];
            if (u.getName().trim().length() < 2) {
                throw new RuntimeException("用户名字不合规 小于2了。。");
            }
        }

        Object ret = methodProxy.invokeSuper(o,objects);
        System.out.println("数据库操作成功····");
        return ret;
    }
}

4.使用 Enhancer的creat方法得到增强类,执行方法即可

package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;

import net.sf.cglib.proxy.Enhancer;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setName("1");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(new UserServiceInterceptor());
        UserServiceImpl userService = (UserServiceImpl)enhancer.create();
        userService.addUser(user);
    }
}

实现效果:

 jdk动态代理和cglb动态代理的区别:

原文地址:https://www.cnblogs.com/andydlz/p/11959558.html