实现动态代理的2种方式
第一种: 用JDK提供的Proxy代理类 和 InvocationHandler调用处理类 配合起来可以拦截一个接口下面的实现类,拦截它的方法,这样可以在它之前做点事情之后做点事情都可以。不过使用JDK这种方式必须实现接口才可以。优势:使用反射创建对象,创建效率高。
面向接口编程 spring里默认用jdk方式。为啥?都有接口,面向接口编程的。下面来实现一个小练习实践理解
①自定义一个接口

②写一个接口实现类

③写一个拦截

④主函数调用

第二种: 用cglib第三方库,它是用asm 这是搞class字节码的,这种方式基于子类的,基于继承,如果类没有接口就可以用这种方式。优势:执行效率高
①创建一个练习类

②创建一个代理类

③主函数调用

运行效果:

上面例子举得不是很好,一般在拦截到类和方法后可以干点拦截前拦截后的事情,再举个例子,比如io流操作拦截到后要close掉,可有时为了效率好则希望把它放入连接池里,下次需要再调用,但是一close掉就销毁了,所以可以在拦截到后再拦截前就把它放入连接池,这次就算close掉也已经放入连接池里下次可以直接拿来用了。
网友评论