spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?

在spring框架中使用了两种代理方式:
1.JDK自带的动态代理。
2.Spring框架自己提供的CGLIB的方式。
这两种也是Spring框架核心AOP的基础。
在详细讲解上述提到的动态代理和CGLIB前,需要明白如下内容:
代理,静态代理,动态代理。 spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?

在spring框架中使用了两种代理方式:

1.JDK自带的动态代理。

2.Spring框架自己提供的CGLIB的方式。

这两种也是Spring框架核心AOP的基础。

在详细讲解上述提到的动态代理和CGLIB前,需要明白如下内容:

代理,静态代理,动态代理。

一、概述

1、什么是代理(Java架构师交流企鹅裙*/*:1028678754 )

代理的概念容易理解,比如:微商,简单来说微商就是替厂家卖商品。当我们从微商(代理)那里买东西时通常不知道背后的商家究竟是谁,也就是说,委托者对我们来说是不可见的。作为微商,有其自己的目标客户,这也相当于为厂家做了一次过滤。把微商和厂家进一步抽象,微商可以抽象为代理类,厂家可抽象为委托类(被代理类)。通过微商和厂家特点可知,通过使用代理,通常有两个优点:

其一:可以隐藏委托类的实现;

其二:可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理。

2、静态代理

若代理类在程序运行前就已经存在,那么这种代理方式被成为静态代理。

这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下,静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类。 下面我们用Vendor类代表生产厂家,BusinessAgent类代表微商代理,来介绍下静态代理的简单实现。

委托类和代理类都实现了Sell接口,Sell接口的定义如下:

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?Vendor类的定义如下:

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?从BusinessAgent类的定义我们可以了解到,静态代理可以通过聚合来实现,让代理类持有一个委托类的引用即可。

如果需要增加一个需求:给Vendor类增加一个过滤功能,不可以卖给学生。通过静态代理,我们无需修改Vendor类的代码就可以实现,只需在BusinessAgent类中的sell方法中添加一个判断即可。如上图可以。

这对应着我们上面提到的使用代理的第二个优点:可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理。静态代理的局限在于运行前必须编写好代理类,下面我们重点来介绍下运行时生成代理类的动态代理方式,即动态代理机制。

二、动态代理

代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。 这么说比较抽象,下面我们结合一个实例来介绍一下动态代理的这个优势是怎么体现的。

现在,假设我们要实现这样一个需求:在执行委托类中的方法之前输出“before”,在执行完毕后输出“after”。我们还是以上面例子中的Vendor类作为委托类,BusinessAgent类作为代理类来进行介绍。首先我们来使用静态代理来实现这一需求,相关代码如下:

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?从以上代码中我们可以了解到,通过静态代理实现我们的需求需要我们在每个方法中都添加相应的逻辑,这里只存在两个方法所以工作量还不算大,假如Sell接口中包含上百个方法呢?这时候使用静态代理就会编写许多冗余代码。通过使用动态代理,我们可以做一个“统一指示”,从而对所有代理类的方法进行统一处理,而不用逐一修改每个方法。下面我们来具体介绍下如何使用动态代理方式实现我们的需求。

2、使用动态代理

(1)InvocationHandler接口

在使用动态代理时,我们需要定义一个位于代理类与委托类之间的中介类,这个中介类被要求实现InvocationHandler接口,这个接口的定义如下:

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?从InvocationHandler这个名称我们就可以知道,实现了这个接口的中介类用做“调用处理器”。当我们调用代理类对象的方法时,这个“调用”会转送到invoke方法中,代理类对象作为proxy参数传入,参数method标识了我们具体调用的是代理类的哪个方法,args为这个方法的参数。这样一来,我们对代理类中的所有方法的调用都会变为对invoke的调用,这样我们可以在invoke方法中添加统一的处理逻辑(也可以根据method参数对不同的代理类方法做不同的处理)。因此我们只需在中介类的invoke方法实现中输出“before”,然后调用委托类的invoke方法,再输出“after”。下面我们来一步一步具体实现它。

(2)委托类的定义

动态代理方式下,要求委托类必须实现某个接口,这里我们实现的是Sell接口。委托类Vendor类的定义如下:

(3)中介类

上面我们提到过,中介类必须实现InvocationHandler接口,作为调用处理器”拦截“对代理类方法的调用。中介类的定义如下:

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?

从以上代码中我们可以看到,中介类持有一个委托类对象引用,在invoke方法中调用了委托类对象的相应方法,通过聚合方式持有委托类对象引用,把外部对invoke的调用最终都转为对委托类对象的调用。下面我们来介绍一下如何”指示“以动态生成代理类。

(4)动态生成代理类

动态生成代理类的相关代码如下:

在以上代码中,我们调用Proxy类的newProxyInstance方法来获取一个代理类实例。这个代理类实现了我们指定的接口并且会把方法调用分发到指定的调用处理器。这个方法的声明如下:

public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?

Spring AOP通知执行的内部原理是什么?

在我的理解中 通知执行指的是前置/后置/异常/围绕通知。这些通知的原理实际上可以认为是AOP的实现原理。

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?

Spring AOP的底层是通过代理来实现的,常见的如JDK的动态代理,CGLIB的动态代理,动态代理技术这里我就选择性的忽略了,因为这也是我们在面试的时候会被经常问到的技术。但是如果我们再向下深入的去追究原理,我们会发现另外一种框架:ASM。

ASM是什么呢?如果你有研究过源码,你会发现在Spring的AOP相关jar中,有

asm.jar

的相关身影,ASM是一种Java 字节码操控框架,为什么这么说呢?因为他可以在类被加载入 Java 虚拟机之前动态改变类行为,比如在某一行代码前/后做一些其他业务,比如日志信息。而改变类行为是直接作用到class文件中,也就实现了AOP中各种执行通知。

但是ASM 与 Proxy 编程是有不同之处的,首先

ASM 更小更快,因为其直接作用于字节码,其次ASM不需要为增强代码而新定义一个

接口,它直接生成的代码去覆盖原来的类。而ASM 已经被广泛应用于一系列 Java 项目:比如我们很熟悉的CGLIB和AspectJ。 Spring 也通过 cglib,另一个更高层一些的自动代码生成工具使用了 ASM。

希望我的回答能对你有所帮助

spring aop代理,JAVA高级架构师基础功:Spring中AOP有那种两种代理方式?

springmvc和mybatis整合可不可以不需要spring?

首先回答你的问题,肯定是不可以的。提这个问题可能是你对Spring和SpringMVC本身理解不够。下面我简单介绍一下Spring。

Spring:

我们一般单说Spring是指的Spring Frameworkzh.wikipedia.org

是一个开源的全栈的开发框架,Spring提供一个功能强大的Spring容器。 核心是 AOP 和 IOC。

SpringMVC

要说SpringMVC前,先说一下什么是MVC。

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式。 可以看到只有是这样三层结构设计的都是MVC框架。 较老的SSH中的 Struts 就是一个MVC框架。随着Spring的发展,Spring本身也有了自己的MVC实现,也就是SpringMVC。而且慢慢取代了Struts。

Spring Boot

因为Spring项目的配置复杂等问题, 为了简化开发者的使用,从而创造性地推出了Spring Boot。约定优于配置,简化了spring的配置流程。 Spring Boot里面有大量的第三方启动包,可以快速搭建项目,可以简单理解是一个 Spring项目的脚手架, 懒人包。

Spring Cloud

有了Spring Boot已经可以快速搭建一个服务。但是随着微服务的兴起,服务越来越多。服务的治理成了最主要的问题, Spring Cloud就应运而生。

Spring Cloud基于Spring Boot,为微服务体系开发中的架构问题,提供了一整完套的解决方案,包括:服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

最后官网学习最靠谱,自己可以加深一下理解。

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

发表评论

登录后才能评论