Spring系列之 AOP原理篇

Spring系列之 AOP原理篇

大家好,我叫Spring,是众多程序员朋友手心的宝贝,AOP作为我体内的重要组成部分,尽管其重要性无可替代,但使用起来却相当直观和简便。我们只需创建一个类,并将其标记为切面(@Aspect),即可激活AOP的功能。在切面类中定义增强方法,使用如@After、@AfterReturning、@Around等注解来指示增强逻辑在目标方法执行的不同阶段介入。例如,@After在方法执行后触发,@AfterReturning在方法正常返回后执行,而@Around则可以完全包围目标方法。

让我们举个例子,假如我们想在某个方法执行后记录日志,只需简单地添加@After注解即可。如果想要在方法抛出异常后执行特定逻辑,则可以使用@AfterThrowing。通过这些注解,我们可以精准地针对特定类的特定方法实施增强。一旦完成了这些基本设置,AOP就可以在我的环境中发挥作用了。当原有的bean方法被调用时,相应的增强逻辑就会自动执行。

那么,AOP在我体内是如何运行的呢?当我启动时,会创建IOC容器,并对容器中的bean进行三个关键步骤:构造、属性注入、初始化。AOP的实现可以视为IOC容器的一个附加功能,特别是在处理AOP后置处理器方面。bean的完整生命周期和AOP的集成在系列教程的第一集中有详细介绍。

在bean初始化完成后,我会检查是否需要对该bean应用AOP。如果配置的切面条件符合,我将为符合条件的bean创建代理对象,以实现AOP。为了统一和简化代理对象的创建,我提供了一个代理工厂,它可以根据具体情况选择CGLIB或JDK Proxy作为代理策略。通常,我会将proxyTargetClass属性设置为true,以强制使用CGLIB,这也是Spring Boot的默认配置。然而,如果该属性设为false,且目标类实现了至少一个接口,系统将使用JDK Proxy;否则,仍会使用CGLIB。

确定了代理策略后,代理工厂将目标bean封装为其内部的一个成员变量。当我们调用bean的方法时,实际上是在执行代理对象的invoke方法。该方法首先解析execution表达式,找到与当前方法匹配的所有增强方法,并按顺序排列成调用链。接下来,代理对象会按照责任链模式依次执行这些增强方法,其间会插入并执行目标bean的真实方法。

以CGLIB AOP Proxy为例,它在getProxy方法中构建代理对象,并通过enhancer.create()生成代理实例。与JDK Proxy不同,CGLIB基于ASM(Java字节码生成库)生成新的.class文件,这意味着即使目标bean没有实现任何接口,也能为其创建代理对象。当调用bean方法时,会先执行代理对象的intercept方法,如同JDK Proxy一样,通过责任链模式执行所有增强逻辑。

以上就是AOP在Spring框架中底层原理的概述。如果你能耐心阅读至此,那必定是我的忠实粉丝了。各位大佬,别忘了长按点赞按钮,给我一个三连,你的支持是我前进的动力!