Spring AOP

1.什么是Spring AOP?

    AOP 技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。使用“横切”技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

 

  1. Spring AOP实现原理

参考文档:https://blog.csdn.net/jackFXX/article/details/81636507

组织关系图:

两种代理

Spring AOP的设计理念,便是将一些与业务逻辑无关的关注点分离出来,例如,当我之时某些方法之时,我需要知道方法执行前后的日志信息,同时希望能够尽可能的减少代码量,该如何去处理?自然而然会想到代理模式,对于某个对象的调用,转而去访问它的代理对象,而无需知道它的存在,使对象对于调用者而言是完全透明的。相信大家都对代理模式有过一定的了解,其中主要有静态代理以及动态代理,静态代理所代理的对象在运行之前就必须确定,因此针对某些特定的业务场景,动态代理将是最完美的选择。

JDK动态代理:

一个Hello接口,里面定义了一个sayHello()方法

实现类 

代理类:

测试类:

测试结果:

从上面的例子可以很显然的看到,JDK的动态代理主要是针对于接口的,同时它的实现主要是由InvocationHandler对象的invoke()方法里面,同时需要注意,它仅仅能够代理当前接口里面的方法,并不能代理其父类的方法!

 

Cglib代理:

代理的对象使用上文的HelloImpl类,代理类如下:

测试类:

测试结果:

从上面的例子可以看出,Cglib代理的实现主要是封装在MethodInteceptor对象的intercept()方法里面。

 

原理实现:

 
 

 

它们之间的调用先后次序反映在上图的序号中:

调用者 Bean 尝试调用目标方法,但是被生成的代理截了胡,代理根据 Advice 的种类(本例中是@Before Advice),对 Advice 首先进行调用代理调用目标方法

返回调用结果给调用者 Bean(由代理返回,没有体现在图中)

在 java 的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看 java 的 API 帮助文档是怎么样对这两个类进行描述的:

1.InvocationHandler:

每一个动态代理类都必须要实现 InvocationHandler 这个接口,并且每个代理类的实例都关联到了一个 handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由 InvocationHandler 这个接口的 invoke 方法来进行调用。我们来看看 InvocationHandler 这个接口的唯一一个方法 invoke 方法

Object invoke(Object proxy, Method method, Object[] args) throws Throwable

proxy: 指代我们所代理的那个真实对象

method:指代的是我们所要调用真实对象的某个方法的 Method 对象

args: 指代的是调用真实对象某个方法时接受的参数

2.Proxy

Proxy 这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, Inv ocationHandler h) throws IllegalArgumentException

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值