您现在的位置是:群英 > 开发技术 > 编程语言
Java中实现AOP代理的方法和操作是怎样?
Admin发表于 2022-10-11 09:18:06374 次浏览
在这篇文章中我们将学习“Java中实现AOP代理的方法和操作是怎样?”的相关知识,下文有详细的介绍及实例,步骤过程清晰,简单易懂,小编觉得挺不错的,有需要的朋友可以借鉴参考,希望大家阅读完这篇能有所获。

业务场景:首先你有了一个非常好的前辈无时无刻的在“教育”你。有这么一天,它叫你将它写好的一个方法进行改进测试,这时出现了功能迭代的情况。然后前辈好好“教育”你的说,不行改我的代码!改就腿打折!悲催的你有两条路可走,拿出你10年跆拳道的功夫去火拼一波然后拍拍屁股潇洒走人,要么就是悲催的开始百度。。。这时你会发现,我擦怎么把AOP代理这种事给忘了?【其实在我们工作中很少去手写它,但是它又是很常见的在使用(控制台日志)】

怎么办?打赢送手镯,打输睡大觉?

兄弟,信我的!

写吧。。。

AOP是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善,它以通过预编译方式和运行期动态代理方式实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

简单说就是在不影响原有功能代码的情况下进行扩展,浸入少。

废话不多说,开搞!

1、JDK实现

MyAop
package com.example.quasar.aop;
 
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
//继承InvocationHandler接口实现
public class MyAop implements InvocationHandler {
    private Object object;
 
    public MyAop(Object object) {
        this.object = object;
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //前置
        System.out.println("前置运行");
        Object invoke = method.invoke(this.object, args);
        //后置
        System.out.println("后置运行");
        return invoke;
    }
}

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 java.lang.reflect.Proxy;
 
@SpringBootApplication
public class QuasarApplication {
 
    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;
 
@SpringBootApplication
public 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
@Component
public 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代理的方法和操作是怎样?”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-05-18 17:37:09 
摘要:一、gateway网关简介api 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过api 网关这一层。也就是说,api 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 api
2022-08-19 17:48:17 
摘要:今天使用python计算数据相关性,但是发现计算出的表格中间好多省略号,而且也不对齐。怎么解决这个问题,下面小编给大家带来了python中pandas如何输出完整、对齐的表格,感兴趣的朋友一起看看吧
2022-05-14 15:23:31 
摘要:本篇文章给大家带来了关于java的相关知识,其中主要介绍了java面向对象的相关问题,包括了面向对象的基本特性、对象间的关系等等相关内容,希望对大家有帮助。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部