【spring源码-10】bean的实例化(7)AOP-早期的aop

1,523 阅读2分钟

上一篇【spring源码-9】bean的实例化(6)循环依赖

引题

看到这里,bean的实例化已经接近尾声,ioc已完结,接下来就是spring另外一个核心-aop。 spring aop 是依赖于 ioc 来管理的。

早期的AOP

在没有出现注解之前,spring的功能都是通过配置实现的,早期的aop也不例外,有三种配置方式。这里不描述长篇的理论,可以简单理解为spring aop 就是对现有方法的增强

基于接口配置

该方式是在spring 1.2 版本出现的,也是最早的 aop。

Advice 方式

  1. 定义需要被增强的类

image.png

  1. 定义advice(增强)

image.png

  1. 通过配置使增强作用于目标方法

image.png

  1. 调用代理对象增强方法

image.png

Interceptor 方式

  1. 定义拦截器

image.png

  1. 通过配置使增强作用于目标方法

image.png

image.png

两种方式其实一样,都实现了 Advice 接口

image.png

Advisor 方式

Advice、Interceptor 作用范围是类中所有的方法,不能指定方法。由此引入了 Advisor 概念。 Advisor 可以指定 Advice 和 目标方法:

  1. 指定代理对象和增强

image.png

  1. 创建Advisor 和 代理对象

image.png image.png

到此,我们已经可以实现增强指定方式,但是需要为每一个类创建代理对象,之后使用bean的时候直接获取代理对象。功能有了,但是成本高。

自动配置 autoproxy

BeanNameAutoProxyCreator

  1. 指定代理对象和增强

image.png

  1. 创建 AutoProxyCreator

image.png

此时的代理对象不是手动生成的了,代理对象的名称会有变化,变成了目标对象的bean名称。

image.png

RegexpMethodPointcutAdvisor

  1. 指定代理对象和增强

image.png

  1. 创建 RegexpMethodPointcutAdvisor

image.png 不过这种方式不能指定到方法

总结

spring 在 1.2 版本的时候是通过 接口 + ProxyFactoryBean 的方式设置代理。

注:本文通过源码 + 行说明的方式进行描述,若不好理解可留言。本文仅为个人学习记录,有错误的地方,请大佬们指正。