示例背景:现有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动态代理的区别: