© 版权声明:本文为博主原创文章,转载请注明出处
CGLIB动态代理:
CGLIB动态代理就是对指定的类生成一个子类,覆盖其中所有的方法并环绕增强
优势:
- 1. 业务类只需要关注业务逻辑本身,保证了业务类的重用性
- 2. 只需一个动态代理类就可以代理很多类,大大减少了代理类的规模,便于维护
- 3. 接口变了,动态代理类也不需要任何改动
- 4. 可以代理没有实现任何一个接口的类
劣势:
- 1. 不可以对final修饰的类或方法进行代理
实例:
1.项目结构
2.pom.xml
4.0.0 org.proxy DynamicProxy-CGlib 0.0.1-SNAPSHOT jar UTF-8 junit junit 4.12 test cglib cglib 3.2.5
3.Hello.java
package org.proxy.DynamicProxy_CGlib;public class Hello { public void say(String name) { System.out.println("Hello!" + name); } }
4.CGLibProxy.java
package org.proxy.DynamicProxy_CGlib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CGLibProxy implements MethodInterceptor { private static CGLibProxy instance = new CGLibProxy(); private CGLibProxy() { } public static CGLibProxy getInstance() { return instance; } @SuppressWarnings("unchecked") publicT getProxy(Class cls) { return (T) Enhancer.create(cls, this); } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj, args); after(); return result; } private void before() { System.out.println("Before"); } private void after() { System.out.println("After"); }}
5.TestCGLibDynamicProxy.java
package org.proxy.test;import org.junit.Test;import org.proxy.DynamicProxy_CGlib.CGLibProxy;import org.proxy.DynamicProxy_CGlib.Hello;public class TestCGLibDynamicProxy { @Test public void testHello() { Hello helloProxy = CGLibProxy.getInstance().getProxy(Hello.class); helloProxy.say("Jack"); } }
6.效果预览
参考:《架构探险-从零开始写Java Web框架》(黄勇著)