spring流程原理之AOP

寻找入口

Spring 的 AOP 是通过接入 BeanPostProcessor 后置处理器开始的,它是 Spring IOC 容器经常使用到 的一个特性,这个 Bean 后置处理器是一个监听器,可以监听容器触发的 Bean 声明周期事件.

BeanPostProcessor 后置处理器的调用发生在 Spring IOC 容器完成对 Bean 实例对象的创建和属性的 依赖注入完成之后

在 AbstractAutowireCapableBeanFactory 类中initializeBean()方法为容器产生的 Bean 实例对象添加 BeanPostProcessor 后置处理器

选择代理策略

AbstractAutoProxyCreator 类。该类重写了 postProcessAfterInitialization()方法调到了一个非常核心的方法 wrapIfNecessary(),

发现最终调用的是 proxyFactory.getProxy()方法.到这里我们大概能够猜到 proxyFactory 有 JDK 和 CGLib 的,那么我们该如何选择呢?最终调用的是 DefaultAopProxyFactory 的 createAopProxy()方法:

调用代理方法

从 JdkDynamicAopProxy 的源码我们可以看到这个类其实也实 现了 InvocationHandle。首先获取应用到此方法上的通知链(Interceptor Chain)。如果有通知,则 应用通知,并执行 JoinPoint;如果没有通知,则直接反射执行 JoinPoint。而这里的关键是通知链是如 何获取的以及它又是如何执行的呢?现在来逐一分析。首先,从上面的代码可以看到,通知链是通过 Advised.getInterceptorsAndDynamicInterceptionAdvice()这个方法来获取的

触发通知

在为 AopProxy 代理对象配置拦截器的实现中,有一个取得拦截器的配置过程,这个过 程是由 DefaultAdvisorChainFactory 实现的,这个工厂类负责生成拦截器链,在它的 getInterceptorsAndDynamicInterceptionAdvice 方法中,有一个适配器和注册过程, 通过配置 Spring 预先设计好的拦截器,Spring 加入了它对 AOP 实现的处理 

AOP时序图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP(面向切面编程)使用代理模式来实现,它通过在运行时动态地为目标对象创建一个代理对象,并在代理对象中注入横切关注点(切面)的代码,从而实现了对目标对象的增强。 Spring AOP 的核心原理是基于动态代理。Spring AOP 提供了两种代理方式:JDK 动态代理和 CGLIB 代理。如果目标对象实现了接口,则使用 JDK 动态代理,否则使用 CGLIB 代理。 Spring AOP 主要涉及以下三个概念: 1. 切面(Aspect):切面是一个类,其中包含了一些横切关注点(Advice)和切点(Pointcut)。横切关注点是指在何时、何地、何种情况下要执行的代码,而切点则是指在哪些连接点上应用切面。 2. 连接点(Join point):连接点是程序执行过程中的一个特定点,例如方法调用、异常抛出、属性设置等。 3. 通知(Advice):通知是切面在连接点上执行的动作。Spring AOP 提供了以下五种通知类型: - 前置通知(Before advice):在连接点之前执行。 - 后置通知(After returning advice):在连接点执行之后执行。 - 环绕通知(Around advice):在连接点之前和之后都执行。 - 异常通知(After throwing advice):在连接点抛出异常后执行。 - 最终通知(After advice):在连接点执行之后执行,无论连接点是否抛出异常。 Spring AOP 的执行流程如下: 1. Spring 容器启动时,根据配置文件或注解创建切面(Aspect)对象。 2. 当一个 Bean 被实例化时,Spring 将会检查它是否需要被代理。 3. 如果需要代理,则 Spring 会为该 Bean 创建一个代理对象,并将代理对象注入到容器中。 4. 当客户端请求该 Bean 时,实际上是请求了代理对象。 5. 当代理对象的方法被调用时,代理对象会拦截该方法的调用,并根据配置文件或注解决定是否执行横切关注点的代码。 6. 最后,代理对象将该方法的调用委托给目标对象来执行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值