spring IOC AOP 原理源码解读

Spring IOC(控制反转)和AOP(面向切面编程)是Spring框架的核心功能,它们为Java开发人员提供了一种强大的方式来管理和解耦应用程序的各个组件,以及实现横切关注点。在这篇文章中,我们将深入探讨Spring IOC和AOP的概念、实现原理以及应用场景。 

一、Spring IOC

1.1 概念

IOC,也称为控制反转,是一种设计原则,旨在将对象的创建和管理权从应用程序代码中移交给外部容器。在Spring框架中,IOC容器负责创建、管理和生命周期管理对象。通过使用IOC容器,开发人员可以将应用程序的各个组件解耦,并专注于业务逻辑的实现。

1.2 实现原理

Spring IOC的实现原理主要基于以下三个关键技术:

  • 依赖注入:Spring使用依赖注入机制来将对象之间的依赖关系从硬编码中解耦出来。开发人员可以通过在配置文件中定义bean的依赖关系,或者使用注解方式来声明依赖关系,从而使得应用程序的各个组件能够以松耦合的方式运行。
  • 自动装配:Spring IOC容器通过自动装配机制,根据bean之间的依赖关系自动组装对象。开发人员可以通过在配置文件中使用“<bean/>”标签的“autowire”属性来指定装配方式,如按类型、按名称等。
  • 容器管理:Spring IOC容器负责管理对象的生命周期,包括对象的创建、初始化、销毁等。当应用程序启动时,Spring会扫描指定的配置文件并加载bean定义,然后根据依赖关系自动装配各个对象。在应用程序运行期间,Spring IOC容器会负责管理对象的生命周期,确保对象在需要时能够被创建和使用。

1.3 应用场景

Spring IOC的应用场景非常广泛,例如:

  • 事务管理:通过将事务对象交给Spring IOC容器进行管理,可以方便地在需要时进行事务的开启、提交和回滚操作。
  • 安全性:通过将安全相关的对象交给Spring IOC容器进行管理,可以轻松地实现用户认证、授权等功能。
  • 日志记录:通过将日志记录对象交给Spring IOC容器进行管理,可以在需要时方便地进行日志记录和监控。

二、Spring AOP

2.1 概念

AOP(面向切面编程)是一种编程思想,旨在将应用程序中的横切关注点从业务逻辑中分离出来。在Spring框架中,AOP模块为开发人员提供了一种方便的方式来实现切面编程。通过使用AOP,可以将横切关注点封装为一个个切面,并定义在配置文件中,从而实现代码的高效解耦和复用。

2.2 实现原理

Spring AOP的实现原理主要基于以下三个关键技术:

  • 代理模式:Spring AOP使用代理模式来拦截方法调用。在配置文件中,开发人员可以定义切面(Aspect)和通知(Advice),以及切点(Pointcut)来指定需要拦截的方法。当方法被调用时,Spring AOP会通过代理模式拦截方法的执行流程,并根据切面的定义执行相应的通知操作。
  • 动态代理:Spring AOP支持Java动态代理和CGLIB动态代理。对于接口类型的目标对象,Spring AOP会使用Java动态代理来实现拦截;对于非接口类型的目标对象,Spring AOP会使用CGLIB动态代理来实现拦截。动态代理使得AOP可以透明地插入到目标方法的前后执行逻辑中。
  • AOP通知类型:Spring AOP支持多种类型的通知操作,如前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。通过这些不同类型的通知操作,可以满足不同的横切关注点的需求。

2.3 应用场景

Spring AOP的应用场景也非常广泛,例如:

  • 日志记录:通过定义一个切面来拦截方法调用,并在方法执行前后记录日志信息。这样可以方便地跟踪程序的执行过程和调试问题。
  • 事务管理:通过定义一个切面来拦截方法调用,并在方法执行前后管理事务的开启和提交。这样可以实现事务的自动管理和异常处理。

三、Spring IOC与AOP的集成

Spring框架将IOC和AOP两种设计原则有机地结合在一起,使得开发人员可以更加轻松地构建松耦合、高可扩展的应用程序。通过将IOC容器与AOP模块集成,Spring框架提供了一种强大的解决方案,以满足各种业务需求。

在Spring IOC容器中,可以将切面定义为bean,并通过自动装配的方式将其注入到目标对象中。这样,当目标对象的方法被调用时,Spring AOP模块可以拦截方法的执行流程,并根据切面的定义执行相应的通知操作。

例如,在一个订单处理系统中,我们可能需要记录订单的处理日志。通过定义一个切面来拦截订单处理方法,并在方法执行前后记录日志信息,可以方便地实现日志记录的横切关注点。同时,我们还可以将事务管理对象交给Spring IOC容器进行管理,以便在需要时进行事务的自动管理和异常处理。

四、源码解读

4.1 aop 配置 xml方式

   1.1.xml配置方式

  1.2.找到标签中的命名空间

 1.3.搜索AopNamespaceHandler类

 1.4 对应标签配置解析器

 1.5 最终 ConfigBeanDefinitionParser 重写了parse 方法

1.6 创建一个自动代理对象

1.7 如果有必要注册一个自动化切面代理对象

1.8 点进来之后中间有几个过度实现类没有过多展示,最后找到目标向spring 注入一个AspectJAwareAdvisorAutoProxyCreator对象

1.9 AspectJAwareAdvisorAutoProxyCreator 集成体系中找到了BeanPostProcessor

2.0 发现AspectJAwareAdvisorAutoProxyCreator类中没有,但是AspectJAwareAdvisorAutoProxyCreator继承了类AbstractAdvisorAutoProxyCreator,我们可以在此类中找找,也没有,但是AbstractAdvisorAutoProxyCreator继承了AbstractAutoProxyCreator,我们可以在此类中找找,发现找到了

2.1 点进去发现创建了代理对象的地方

2.2 最终点进来发现spring用JDK的代码生成了一个Proxy对象


4.2.bean 注解方式实现

2.1注解原理步骤

2.2 打开AspectJAutoProxyRegistrar,在该类中实现了ImprotBeanDefinitionRegistrar接口,也就以为这该类需要实现registerBeanDefinitions方法,并通过该方法向IOC容器的BeanDefinitionRegistry中注册Bean信息

2.3 如上xml方式 标题1.9 之后 省略

至此,我们可以知道,AOP 的核心注解 @EnableAspectJAutoProxy 主要就做了一件事,就是向 IOC 容器中注册了一个名称为 internalAutoProxyCreator 值为 AnnotationAwareAspectJAutoProxyCreator 类型的对象的 Bean,那么 AOP 的具体实现就是由 AnnotationAwareAspectJAutoProxyCreator 这个类来完成的了

五、Aop增强

1.有4种增强:

BeanDefinitionRegitryPostProcessor, BeanFactoryPostProcessor, BeanPostProcessor, InitalizingBean

2.处理步骤

> BeanDefinitionRegistryPostProcessor .postProcessorBeanDefinitionRefistry
->BeanDefinitionRegistryPostProcessor. postProcessBeanFactory
-> BeanFactoryPostProcessor.postProcessorBeanFactory方法
-> BeanPostProcessor.postProcessBeforeInitialization: 前置方法
-> IniitializingBean. afterProperties
-> invoke-meethod:invokeInitMethod方法:初始化方法
-> beanPostProcessor.postProcessAfterInitialization: 后置方法

六、总结

Spring框架的IOC和AOP模块是构建松耦合、高可扩展应用程序的重要基石。通过将IOC容器与AOP模块集成,开发人员可以更加高效地实现横切关注点,并将业务逻辑与这些关注点解耦。这使得应用程序更加易于维护、扩展和测试,并提高了代码的可读性和可维护性。

在实际开发中,我们需要根据具体的业务需求来选择合适的IOC容器和AOP框架,并根据实际情况进行配置和优化。同时,我们还需要注意避免过度依赖IOC和AOP带来的问题,如对象创建和管理开销、横切关注点滥用等。只有在合适的场景下合理地使用IOC和AOP,才能充分发挥其优势并提高应用程序的质量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值