用40个类手写spring ioc和aop

开篇先上一张,工程图片:


image.png

这篇文章已经拖了好久了,刚好最近有点时间,终于开搞了。spring 的ioc 和aop作为spring的重要功能,相信大家都已经很熟悉了。
下面再简单的介绍一下:

IOC : 全称 Inversion of control , 翻译为控制反转,还有一个别名di (Dependency injection) 即依赖注入。 由容器来负责对象的生命周期和对象之间的关系,在没有spring之前,对象的创建和注入都是都开发人员保证的,有了ioc 之后, 都交由容器来操作。

AOP: Aspect Oriented programming 面向切面编程,在程序开发中用来解决一些系统层面的问题,比如 日志 事物 权限等。 降低代码的侵入性,执行一些与业务无关的逻辑。

接下来用张图来看下,spring ioc 的运行原理图:

spring ioc.jpg

整个流程,大致分为如下的几部:

  • 资源定位: spring会解析项目中的xml,注解,java,自动装配的配置信息,使用ClassLoader 加载到内存中,为解析做准备
  • 配置元信息的解析:spring会解析这些配置文件,并存放到容器中,使用Map进行保存,配置的元信息被解析为BeanDefinition类
  • 创建Bean的实例 : spring根据解析到的BeanNames , 采用循环遍历的方式,进行bean的创建操作,创建步骤分为了三部分,bean的实例化(依据扫描到的Class信息进行创建),Bean的初始化完成属性的注入,
  • 执行BeanPostProcessor后置处理器,执行 postProcessBeforInstantiation()方法和PostProcessAfterInstantiation()方法,切面中方法的织入也是在该步骤中执行的,下面会进行介绍

spring aop 实现

spring aop .jpg

切面类的织入是在初始化完成之后,执行BeanProcessor的时候,完成的。具体的流程参考图片,此处就不再赘述了。

下面看下spring的高级特性:

1.获取Spring IOC 容器(Aware)

通过ApplicationContextAware实现,在bean实例化后,经过Aware扫描时,发现实现了ApplicationContextAware接口,就会调用setApplicationContext方法注入applicationcontext对象,这也是非常经典的一种获取上下文的方法。

2.动态注册Bean信息(BeanDefinitionRegistryPostProcessor)

通过实现BeanDefinitionRegistryPostProcessor接口完成bean的动态注入, 动态注入Bean非常的简单,获取到当前容器后,然后调用registerBeanDefinition既可。

3.动态修改bean信息(BeanFactoryPostProcessor)

4.自定义工厂bean实例化 (AbstractFacotryBean)

5.通过Spring事件机制完成服务启动后的信息整理(ApplicationListener)

6.服务启动完成后初始化任务(CommandLineRuner)

最后的最后,上我手写的源码地址:https://github.com/topyuluo/spring-project

尽量保留了spring的设计原理和思想,希望对理解源码有帮助。

你可能感兴趣的:(用40个类手写spring ioc和aop)