java aop动态代理,springaop的两种代理方式
00-1010 1.JDK实施2。CGLIB实现3。boot annotation实现【注意只对bean有效】业务场景:首先,你有一个非常好的学长,一直在“教育”你。有一天,它要求你改进并测试它编写的一个方法。这时候就出现了函数迭代的情况。然后学长好好“教育”你,我的代码你改不了!换条腿还能打折!可悲的是,你有两条路可走。拿出你10年的跆拳道功夫,然后拍拍屁股走人,或者伤心地开始百度。这时,你会发现,我到底是怎么忘记AOP代理的?【其实我们在工作中很少手写,但是在使用中很常见(控制台日志)】
我该怎么办?赢了手环,输了睡觉?
兄弟,相信我!
写吧。
AOP是一种设计思想,是软件设计领域的面向方面编程。它是面向对象编程的补充和完善。它是一种通过预编译和运行时动态代理,在不修改源代码的情况下,动态统一地向程序添加附加功能的技术。
AOP可以用来隔离业务逻辑的各个部分,从而降低业务逻辑各个部分之间的耦合度,提高程序的复用性,提高开发效率。
简单来说就是在不影响原有功能代码的情况下进行扩展,沉浸感更少。
别废话了,干吧!
目录
myaopackage com . example . quasar . AOP;导入Java . lang . reflect . invocation handler;导入Java . lang . reflect . method;//继承InvocationHandler接口实现公共类myaop实现invocation handler { privateobjectobject;public my AOP(Object Object){ this . Object=Object;} @ override public object invoke(object proxy,method method,object[]args)throw table {//pre-system . out . println( pre-run );object invoke=method . invoke(this . object,args);//post-system . out . println( post-run );返回调用;} }索引服务
包com . example . quasar . service;公共接口IndexService { public void run();public void run 1();}IndexServiceImpl
包com . example . quasar . service . impl;导入com . example . quasar . service . index service;class indexservice实现索引服务{ @ override public void run(){ system . out . println( run );} @覆盖public void run 1(){ system . out . println( ran 1 );}}QuasarApplication
包com . example . quasar;导入com . example . quasar . AOP . my AOP;导入com . example . quasar . service . index service;导入com . example . quasar . service . impl . indexserviceimpl;导入org . spring framework . boot . auto configure . spring boot application;导入Java . lang . reflect . proxy;@ springbootapplicationpublic类quasar application { public static void main(string[]args){//实现类来实例化IndexService indexService
= new IndexServiceImpl(); //将实例传入aop MyAop myAop = new MyAop(indexService); //通过Proxy.newProxyInstance实现代理 IndexService o = (IndexService) Proxy.newProxyInstance(IndexServiceImpl.class.getClassLoader(), new Class[]{IndexService.class}, myAop); //执行实现方法 o.run(); o.run1(); } }执行结果
2、CGLIB实现
如果项目中,已经使用了Spring,可以忽略导入上述两个包。因为在spring-core中已经集成了。否则需要引入该包,百度去找。
MyAop
package com.example.quasar.aop; public class MyAop { public void befor() { System.out.println("befor..."); } public void after() { System.out.println("after..."); }}
IndexService
package com.example.quasar.service; public interface IndexService { public void run(); public void run1();}
IndexServiceImpl
package com.example.quasar.service.impl; import com.example.quasar.service.IndexService; public class IndexServiceImpl implements IndexService { @Override public void run() { System.out.println("运行了"); } @Override public void run1() { System.out.println("运行了1"); }}
QuasarApplication
package com.example.quasar;import com.example.quasar.aop.MyAop;import com.example.quasar.service.IndexService;import com.example.quasar.service.impl.IndexServiceImpl;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; @SpringBootApplicationpublic class QuasarApplication { public static void main(String[] args) { //实现类实例化 IndexService indexService = new IndexServiceImpl(); // 代理类 ,采用cglib,底层创建目标类的子类 MyAop myAop = new MyAop(); // 核心类 Enhancer enhancer = new Enhancer(); //确定父类 enhancer.setSuperclass(indexService.getClass()); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { //前置 myAop.after(); // 执行目标类的方法 Object obj = method.invoke(indexService, args); //后置 myAop.befor(); return obj; } }); // 3.4 创建代理 IndexService proxService = (IndexService) enhancer.create(); proxService.run(); proxService.run1(); } }
执行结果
3、boot注解实现【注意只对bean有效】
MyAop
package com.v1.aop; import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component; @Aspect@Componentpublic class MyAop { //*号作用:com.v1.service.impl下的所有类和所有方法 @Before(value = "within(com.v1.service.impl.*)") public void before(JoinPoint joinPoint) { System.out.println("before开始执行查询......."); System.out.println("正在执行的目标类是: " + joinPoint.getTarget()); System.out.println("正在执行的目标方法是: " + joinPoint.getSignature().getName()); } //*号作用:com.v1.controller下的所有类和所有方法 @Around(value = "execution(* com.v1.controller.*.*(..))") public Object aroud(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("aroud环绕通知开始......."); System.out.println("执行的目标类 = " + proceedingJoinPoint.getTarget()); System.out.println("执行的目标方法 = " + proceedingJoinPoint.getSignature().getName()); // 必须方法目标方法 Object proceed = proceedingJoinPoint.proceed(); System.out.println("aroud环绕通知结束......."); // 将目标方法的返回值进行返回,否则调用目标方法的方法无法获取到返回值 return proceed; } }
非常简单,直接就根据注解进行代理了!
注解参数可以具体在咱们csdn平台去查一下,有很多文章讲的很细的!
执行结果
发个请求跑一下
以上就是Java实现AOP代理的三种方式详解的详细内容,更多关于Java AOP代理的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。