这篇文章主要介绍“如何编写代码来实现内部之间调用拦截”,在日常操作中,相信很多人在如何编写代码来实现内部之间调用拦截问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何编写代码来实现内部之间调用拦截”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
下面是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的一样.
到此,关于“如何编写代码来实现内部之间调用拦截”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。