java aop动态代理,springaop的两种代理方式

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: