动态代理与cglib
Posted ?一叶之秋?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理与cglib相关的知识,希望对你有一定的参考价值。
代理分为静态代理,jdk动态代理和cglib
1、首先,说一下静态代理。
定义一个接口
public interface Interface{ void doSomething(); void doSomething(String arg); }
定义一个被代理类,并实现接口
public class RealInterface implements Interface { @Override public void doSomething() { System.out.println("doSomething"); } @Override public void doSomething(String arg) { System.out.println("doSomething " + arg); } }
定义一个代理类,并实现接口
public class SimpleProxy implements Interface { private Interface inter; public SimpleProxy(Interface inter) { this.inter = inter; } @Override public void doSomething() { System.out.println("proxy start"); inter.doSomething(); } @Override public void doSomething(String arg) { System.out.println("proxy else start"); inter.doSomething(arg); } }
动态代理 ,动态代理需要实现InvocationHandler接口
public class DynamicProxy implements InvocationHandler { private Object anInterface; public DynamicProxy(Object anInterface) { this.anInterface = anInterface; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("dynamic proxy"); return method.invoke(anInterface,args); } }
cglib,cglib不需要实现接口,通过继承被代理类来实现代理,类似于Spring AOP,由于是继承,不能代理final修饰的类
首先,使用maven引入jar包,通过使用
Enhancer 来实现代理。
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.6</version> </dependency>
/** * 静态代理 * 动态代理 * cglib */ public class Main { public void doSomthing() { System.out.println("cglib doSomething"); } public static void consumer(Interface inter) { inter.doSomething(); inter.doSomething("play"); } public static void main(String[] args) { /** * 静态代理 */ consumer(new RealInterface()); consumer(new SimpleProxy(new RealInterface())); /** * 动态代理 */ Interface realInterface = new RealInterface(); Interface anInterface = (Interface)Proxy.newProxyInstance(realInterface.getClass().getClassLoader(), //Intergace.class.getClassLoader(), realInterface.getClass().getInterfaces(), //new class[] {Interface.class}, new DynamicProxy(realInterface)); consumer(anInterface); /** * cglib */ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Main.class); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("cdlib proxy"); return methodProxy.invokeSuper(o,args); } }); Main main = (Main)enhancer.create(); main.doSomthing(); } }
以上是关于动态代理与cglib的主要内容,如果未能解决你的问题,请参考以下文章