https://www.cnblogs.com/maohuidong/p/7992894.html
介绍cglib动态代理的例子
cglib是一个开源框架,要使用它,需要实现cglib的代理类,它实现MethodInterceptor的代理方法:
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>
1、创建接口
package com.example.demo.service; public interface UserManagerService { void addUser(String userId, String userName); void delUser(String userId); }
2.实现接口
package com.example.demo.service.impl; import com.example.demo.service.UserManagerService; public class UserManagerServiceImpl implements UserManagerService { @Override public void addUser(String userId, String userName) { System.out.println("UserManagerServiceImpl addUser !"); } @Override public void delUser(String userId) { System.out.println("UserManagerServiceImpl delUser !"); } }
3、创建我们的cglib动态代理
package com.example.demo.common; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * * 添加日志动态代理(cglib) */ public class LogCglibHandlerProxy implements MethodInterceptor { private Object target; /** * 创建代理对象 * * @param target * @return */ public Object getInstance(Object target){ this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); //回调方法 enhancer.setCallback(this); //创建代理对象 return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("==========进入cglib的创建动态代理对象============="); System.out.println("进行公共的业务处理: 日志打印开始。。。。"); Object returnObj = methodProxy.invokeSuper(o, objects); System.out.println("进行公共的业务处理: 日志打印完毕。。。。"); return returnObj; } }
4、test
package com.example.demo.common; import com.example.demo.service.UserManagerService; import com.example.demo.service.impl.UserManagerServiceImpl; public class Test { public static void main(String[] args) { LogCglibHandlerProxy cglibHandlerProxy = new LogCglibHandlerProxy(); UserManagerService instance = (UserManagerService) cglibHandlerProxy.getInstance(new UserManagerServiceImpl()); instance.addUser("",""); } }
结果:
==========进入cglib的创建动态代理对象=============
进行公共的业务处理: 日志打印开始。。。。
UserManagerServiceImpl addUser !
进行公共的业务处理: 日志打印完毕。。。。
Process finished with exit code 0
总结 :
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强。
纵观静态代理与动态代理,它们都能实现相同的功能,而我们看从静态代理到动态代理的这个过程,我们会发现其实动态代理只是对类做了进一步抽象和封装,使其复用性和易用性得到进一步提升而这不仅仅符合了面向对象的设计理念,其中还有AOP的身影,这也提供给我们对类抽象的一种参考。关于动态代理与AOP的关系,个人觉得AOP是一种思想,而动态代理是一种AOP思想的实现!