设计模式有23种,代理模式只是其中的一种,代理模式又分为jdk动态代理和cglib动态代理。
接口怎么实现一个bean,使用代理模式实现。
下面我就详细的用代码实现jdk动态代理。
-
首先创建一个被代理类
public class UserServiceImpl implements UserService{ @Override public String showLog(Long id) { System.out.println("输出:"+id); return "输出了"+id; } }
public interface UserService { String showLog(Long id); }
-
创建代理类
//InvocationHandler这是一个接口,通过他使被代理类的方法得到执行 public class JdkProxy implements InvocationHandler { private Object object; public JdkProxy(Object object) { this.object = object; } public JdkProxy() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("张三"); /*这一步就是实现代理类调用被代理类的方法,在前面打印日志就可以在不动类的情况下实现其日志的打印,这也是AOP的底层原理*/ Object invoke = method.invoke(object, args); return invoke; } }
-
创建测试类
@RestController public class Test1Controller { @GetMapping("/getMessage/{id}") public String getExceptionMessage(@PathVariable("id")Integer id){ //被代理类创建对象 UserServiceImpl userService = new UserServiceImpl(); //代理类创建对象,将被代理类的对象放入其中 JdkProxy jdkProxy = new JdkProxy(userService); /*使用反射的方法,将被被代理类的类加载器,接口,InvocationHandler放入其中就可以实现类的代理*/ UserService u = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader() , userService.getClass().getInterfaces(), jdkProxy); String s = u.showLog(Long.valueOf(id)); return s; } }
如果有不太清楚的地方,欢迎在下方评论说出你的问题,我会及时解答。