刷到微信群大家在讨论JF的aop.get(...class)和new区别,这里我觉得可以分享一下它们的区别。
之前有大佬分享过AOP代码的原理和依赖关系,大家可以在上方搜索框:AOP原理
不多说,直 接 上 石马 ~
建几个测试类:
package com.jfinal.test.aop; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; public class TestInterceptor implements Interceptor { public void intercept(Invocation inv) { String methodName = inv.getMethodName(); System.out.println("开头 " + methodName); inv.invoke(); System.out.println("结尾 " + methodName); } }
package com.jfinal.test.aop; import com.jfinal.aop.Before; public class A { @Before(TestInterceptor.class) public void a(){ System.out.println("test-a"); } }
package com.jfinal.test.aop; import com.jfinal.aop.Aop; public class TestAop { public static void main(String[] args) { A a = new A(); System.out.println("生成A的子类Java代码-开始---------"); A aj = Aop.get(A.class); System.out.println("生成A的子类Java代码-结束---------"); System.out.println(a.getClass()); System.out.println(aj.getClass()); aj.a(); } }
好,来运行一下 TestAop的main方法 看效果:
好,这个是aop.get(...class)执行的过程,和使用的效果。
那再来试试new的效果了?
package com.jfinal.test.aop; public class TestAop { public static void main(String[] args) { A a = new A(); a.a(); } }
可见是直接原始运行的a方法,并没有执行 TestInterceptor的代码,写了@Before(TestInterceptor.class)也是没用的。
区别到这里就很明显了,非JF创建的类,不用Aop.get(A.class)是不会执行Interceptor拦截器的。
-------------------------------------------------------------------------------
那么有人就问了,JF创建后的类,再new其他类,会不会有作用了?那么再来实验一下:
加一个B类:
package com.jfinal.test.aop; import com.jfinal.aop.Before; public class B { @Before(TestInterceptor.class) public void b(){ System.out.println("test-b"); } }
A类来调用一下B类
package com.jfinal.test.aop; import com.jfinal.aop.Before; public class A { @Before(TestInterceptor.class) public void a(){ System.out.println("test-a"); new B().b(); } }
package com.jfinal.test.aop; import com.jfinal.aop.Aop; public class TestAop { public static void main(String[] args) { A a = new A(); System.out.println("生成A的子类Java代码-开始---------"); A aj = Aop.get(A.class); System.out.println("生成A的子类Java代码-结束---------"); System.out.println(a.getClass()); System.out.println(aj.getClass()); aj.a(); } }
好,来运行一下 TestAop的main方法 看效果:
可以看到,只要是new,拦截器是不会执行的。
那么想让它依赖执行,不想new,还想拦截器Interceptor起作用了?
https://jfinal.com/doc/4-5
使用 @Inject 注解,再看效果吧:
给A类加上注解:
package com.jfinal.test.aop; import com.jfinal.aop.Before; import com.jfinal.aop.Inject; public class A { @Inject B b; @Before(TestInterceptor.class) public void a(){ System.out.println("test-a"); b.b(); } }
好,来运行一下 TestAop的main方法 看效果:
结果很明显了,得由JF创建,才能被代理。
项目中 业务类 如果不需要执行拦截器Interceptor时,确实new创建对象会更快的。
知道什么时候用,什么时候不用,才是真滴好~
小分享到这里就结束了~ 点个赞呗~