Spring AOP中动态代理的两种实现方式及其过程_ajax工作原理及优缺点

Spring AOP中动态代理的两种实现方式及其过程_ajax工作原理及优缺点AOP思想:基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强!

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

AOP的作用

作用:在不修改源代码的情况下,可以实现功能的增强。


传统的纵向体系代码复用:
这里写图片描述


横向抽取机制(AOP思想):
这里写图片描述
AOP 思想: 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强 !

AOP应用场景

场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )

AOP的实现原理

那Spring中AOP是怎么实现的呢?Spring中AOP的有两种实现方式:
1、JDK动态代理
2、Cglib动态代理

JDK动态代理

1.引入依赖,有spring,单元测,日志管理

<dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>

        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>

2.UserDao接口

public interface UserDao {
    public void saveUser();
}

3.UserDao实现类

public class UserDaoImpl implements UserDao { 
   

    @Override
    public void saveUser() {
        System.out.println("持久层:用户保存");
    }
}

4.动态代理

@Test
    public void test1() {

        final UserDao userDao = new UserDaoImpl();
        // newProxyInstance的三个参数解释:
        // 参数1:代理类的类加载器,同目标类的类加载器
        // 参数2:代理类要实现的接口列表,同目标类实现的接口列表
        // 参数3:回调,是一个InvocationHandler接口的实现对象,当调用代理对象的方法时,执行的是回调中的invoke方法
        //proxy为代理对象
        UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
                userDao.getClass().getInterfaces(), new InvocationHandler() {

                    @Override
                    // 参数proxy:被代理的对象
                    // 参数method:执行的方法,代理对象执行哪个方法,method就是哪个方法
                    // 参数args:执行方法的参数
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("记录日志");
                        Object result = method.invoke(userDao, args);
                        return result;
                    }
                });
        //代理对象执行方法
        proxy.saveUser();
    }

5.结果
在没有修改原有类的代码的情况下,对原有类的功能进行了增强
这里写图片描述

Cglib动态代理

在实际开发中,可能需要对没有实现接口的类增强,用JDK动态代理的方式就没法实现。采用Cglib动态代理可以对没有实现接口的类产生代理,实际上是生成了目标类的子类来增强。
 首先,需要导入Cglib所需的jar包。提示:spring已经集成了cglib,我们已经导入了spring包,所以不需要再导入其它包了。
1.创建LinkManDao类,没有实现任何接口

public class LinkManDao {
    public void save(){
        System.out.println("持久层:联系人保存....");
    }
}

2.动态代理

@Test
    public void test2() {
        final LinkManDao linkManDao = new LinkManDao();
        // 创建cglib核心对象
        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(linkManDao.getClass());
        // 设置回调
        enhancer.setCallback(new MethodInterceptor() {
            /** * 当你调用目标方法时,实质上是调用该方法 * intercept四个参数: * proxy:代理对象 * method:目标方法 * args:目标方法的形参 * methodProxy:代理方法 */
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
                    throws Throwable {
                System.out.println("记录日志");
                 Object result = method.invoke(linkManDao, args);
                return result;
            }
        });
        // 创建代理对象
        LinkManDao proxy = (LinkManDao) enhancer.create();
        proxy.save();
    }

3.结果
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192339.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Github搭建个人博客(2019最新版,亲测)

    Github搭建个人博客(2019最新版,亲测)版权声明:本文为徐代龙原创文章,未经徐代龙允许不得转载。https://blog.csdn.net/xudailong_blog/article/details/78762262(一)前言:建议:慢慢看,也就这一篇用心了点写说来话长,一把辛酸泪,可算是弄好了。1起因:在很早很早,大一的时候,估计快记不得日子了,那时候来到PC吧创业团队,一个大一级的学长通过…

    2022年5月27日
    31
  • 如何搭建ntp时间服务器(搭建时间同步服务器)

    NTP(NetworkTimeProtocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。NTP服务器就是利用NTP协议提供时间同步服务的。

    2022年4月9日
    434
  • JVM调优工具总结

    JVM调优工具总结一、jps:虚拟机进程状况工具它可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(MainClass,main()函数所在的类)名称以及正在运行的本地虚拟机唯一ID(LVMID);它是使用率最高的一个JDK命令行工具,因为其他的命令行工具都需要输入查询到的ID来确定要监控的是哪一个虚拟机进程。命令格式:jps[options][hostid]选项作用-q只…

    2022年5月6日
    40
  • 聊聊学习和成长

    聊聊学习和成长

    2022年3月7日
    44
  • 用npm安装yarn(买电脑主要看哪些配置)

    写在前面:前端开发常需要配合后台同时进行,在没有后台的情况下,服务器通信和获取数据进行页面渲染就无法进行。使用Javascript编写的Node.js服务器,对于前端开发人员来说,可以免去对学习服务器脚本语言的学习成本,能够在短时间构建一套完整的、高效的Web服务。NPM(NodePackageManager)作为Node.js的依赖包管理器便应运而生,而YARN则是针对NPM的一些不太优…

    2022年4月10日
    41
  • 十大安全数字货币钱包排行榜_全球数字货币排行

    十大安全数字货币钱包排行榜_全球数字货币排行链客,专为开发者而生,有问必答!此文章来自区块链技术社区,未经允许拒绝转载。随着全球加密数字货币规模正在超高速的增长,数字货币的安全存储成为了关键的一环,也是决定其健康可持续发展的基石。市场崛起引发了全球对加密数字货币未来前景的关注和期待,数字货币钱包也就应运而生。大批投资者涌入币圈炒币,都离不开数字货币钱包,那么哪些数字货币钱包比较安全呢?下面我们就来一起探讨一下吧。1、Imtoken…

    2022年10月9日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号