乐趣区

如何实现Spring框架中的AOP

声明一个 AdvisedSupport 类,用于保存被代理对象和拦截方法的元数据对象

创建织入点 AopProxy,可以通过 getProxy 方法获取代理后的对象。使用 CGLIB 生成动态代理,生成 Enhancer 实例,并指定用于处理代理业务的回调类

完成了织入之后,我们要考虑另外一个问题:对什么类以及什么方法进行 AOP?对于“在哪切”这一问题的定义,我们又叫做“Pointcut”。Spring 中关于 Pointcut 包含两个角色:ClassFilter 和 MethodMatcher,分别是对类和方法做匹配。Pointcut 有很多种定义方法,例如类名匹配、正则匹配等,但是应用比较广泛的应该是和 AspectJ 表达式的方式,Spring 借鉴了这种方式

万事俱备,只欠东风!现在我们有了 Pointcut 和 Weave 技术,一个 AOP 已经算是完成了,但是它还没有结合到 Spring 中去。怎么进行结合呢?Spring 给了一个巧妙的答案:使用 BeanPostProcessor

BeanPostProcessor 是 BeanFactory 提供的,在 Bean 初始化过程中进行扩展的接口。只要你的 Bean 实现了 BeanPostProcessor 接口,那么 Spring 在初始化时,会优先找到它们,并且在 Bean 的初始化过程中,调用这个接口,从而实现对 BeanFactory 核心无侵入的扩展

那么我们的 AOP 是怎么实现的呢?我们知道,在 AOP 的 xml 配置中,我们会写这样一句话:

<aop:aspectj-autoproxy/>

它其实相当于:

<bean id="autoProxyCreator" class="org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator"></bean>

AspectJAwareAdvisorAutoProxyCreator 就是 AspectJ 方式实现织入的核心。它其实是一个 BeanPostProcessor。在这里它会扫描所有 Pointcut,并对 bean 做织入

文章来源:www.liangsonghua.me
作者介绍:京东资深工程师 - 梁松华,长期关注稳定性保障、敏捷开发、JAVA 高级、微服务架构

退出移动版