我们经常用的那些诸如spring
、Mybatis
等框架底层用到了大量的代理模式。可以说如果想进阶Java
的高级开发层次,代理模式无论如何是绕不开的。
我们常说的代理模式,主要分为两种:静态代理和动态代理。静态代理是代理静态的代理了指定的类方法,这种方式很简单,但是不够灵活,于是动态代理就应运而生,动态代理可以动态的代理指定类里面的方法,可以在代理类里面做很多的功能,比如Mybatis的Mapper,spring的AOP等等。
今天的代码框架如下:
UserServiceStaticProxy:静态代理类
JdkPropxyHandler:Jdk动态代理处理类,实现自InvocationHandler
UserServiceJdkProxy:Jdk动态代理类,方法中用到了JdkPropxyHandler
CGLibInterceptor:CGLib的动态代理拦截器类,实现自MethodInterceptor
UserServiceCGLibProxy:CGLib的动态代理类,里面用到了CGLibInterceptor
1. 静态代理
代理类和被代理类都实现自同一个接口,代理类里面有调用被代理类,而对外提供的实现是代理类。
1 | package com.songwh.proxydemo.service.impl; |
2. 动态代理
2.1 JDK动态代理
jdk的动态代理类使用也很简单:
只需要如下代码即可,里面的参数都来自被代理对象
1 | // 被代理的对象 |
代理类的完成代码:
1 |
|
代理处理器,实现自InvocationHandler
1 | package com.songwh.proxydemo.handler; |
2.2 CGLib动态代理
CGLib的动态代理更简单,CGLib的代理原理是采用继承的方式,子类调用父类的方法。主需要如下一行代码即可实现一个cglib的动态代理:
1 | (IUserService) Enhancer.create(userService.getClass(), new CGLibInterceptor()); |
完成的类方法如下:
1 | package com.songwh.proxydemo.service.impl; |
CGLib的方法拦截器实现类如下:
1 | package com.songwh.proxydemo.handler; |