1、前言
对于 Spring 都 IOC 跟 AOP 的概念想必大家都很熟悉,但 IOC、AOP 不只是局限于 Spring。duboo 自己也实现了 IOC 的概念,使用一个容器管理 bean 的生命周期。而 AOP 也不是 spring 才有运用,完全实现 AOP 概念的是 Aspectj 语言,只是 spring 只用于他的表达式匹配而已,而没有引入另外一门语言(增加学习成本)。
AOP 是一种编程概念,实现技术有动态代理、cglib 代理。jdk 动态代理只能代理接口,而 cglib 代理主要是通过继承来实现。我认为 AOP 比较重要有这几个概念:
- 切入点:主要切哪里,根据表达式来定位
- 表达式:定义需要切的地方,跟正则表达式功能类似
- 通知:前置通知、后置通知、环绕通知等,定义切的时候的行为,比如前置通知是在方法执行之前需要做啥,以此类推
2、设计
工程来自于:https://github.com/code4craft/tiny-spring/tree/master
作者实现了一个比较完整的小型的 IOC、AOP 容器,可以去围观一波。它主要的流程如下:
- ApplicationContext 完成了类定义的读取和加载,并注册到 BeanFactory 中去。
- ApplicationContext 从 BeanFactory 中寻找 BeanPostProcessor,注册到 BeanFactory 维护的 BeanPostProcessor 列表中去。
- ApplicationContext 以单例的模式,通过主动调用 getBean 实例化、注入属性、然后初始化 BeanFactory 中所有的 Bean。由于所有的 BeanPostProcessor 都已经在第 2 步中完成实例化了,因此接下来实例化的是普通 Bean,因此普通 Bean 的初始化过程可以正常执行。
- 调用 getBean 时,委托给 BeanFactory,此时只是简单的返回每个 Bean 单例,因为所有的 Bean 实例在第三步都已经生成了。
看工程的时候,只需要看 ApplicationContextTest 即可,它是主要的入口,封装了一切调用。
IOC 容器实现比较简单,就是 xml 中定义好 bean,然后在程序中解析注入 beanFactory 即可。对于 AOP,使用了 jdk 动态代理、cglib 动态代理实现,在匹配哪些类需要被代理时,使用了 aspectj 的表达式匹配方法。
网友评论