这篇文章主要介绍“如何编写代码来实现内部之间调用拦截”,在日常操作中,相信很多人在如何编写代码来实现内部之间调用拦截问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何编写代码来实现内部之间调用拦截”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联公司专注于长泰网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供长泰营销型网站建设,长泰网站制作、长泰网页设计、长泰网站官网定制、成都微信小程序服务,打造长泰网络公司原创品牌,更为您提供长泰网站排名全网营销落地服务。
下面是CGLib的原生写法(使用net.sf.cglib.proxy.*包内的类实现)
class Foo {public void fun1(){ System.out.println("fun1"); fun2(); }public void fun2() { System.out.println("fun2"); } }class CGlibProxyEnhancer implements MethodInterceptor{public Object getProxy(Class clazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(this);return enhancer.create(); }@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.print("before ");Object result = proxy.invokeSuper(obj,args);return result; } }public class Test {public static void main(String[] args) { CGlibProxyEnhancer pf = new CGlibProxyEnhancer(); Foo foo = (Foo) pf.getProxy(Foo.class); foo.fun1(); } }
打印结果是:
before fun1
before fun2
可以看到,虽然fun2()是通过foo.fun1()调用的,但fun()2依然能被代理。
但如果用Spring AOP那套基本写法的话:
class Foo {public void fun1() {System.out.println("fun1"); fun2(); }public void fun2() {System.out.println("fun2"); } }class Before implements MethodBeforeAdvice {public void before(Method method, Object[] objects, Object o) throws Throwable {System.out.print("before "); } }public class TestCGLib {public static void main(String[] args) { Foo foo = new Foo(); BeforeAdvice advice = new Before(); ProxyFactory pf = new ProxyFactory(); pf.setOptimize(true);//启用Cglib2AopProxy创建代理 pf.setProxyTargetClass(true); pf.setTarget(foo); pf.addAdvice(advice); Foo proxy = (Foo) pf.getProxy(); proxy.fun1(); } }
输出结果是:
before fun1
fun2
可见fun2方法没有被代理。
这个帖子中还说到了如何将cglib中的fun2改为private则最终结果与常规AOP的一样.
到此,关于“如何编写代码来实现内部之间调用拦截”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!