spring Aop

使用面向对象(OOP)编程有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时(例如日志、安全检测等),只能在每个对象里引用公共行为,这样程序中就产生了大量重复的代码,不便于维护,所以可以使用面向切面(AOP)编程作为一个补充,Aop是横向的而OOP是纵向的。

spring 应用上下文(ApplicationContext)

前面介绍bean加载时都是站在BeanFactory的角度上进行的,相当于将spring纯粹当成一个bean容器工具来使用。其实spring另外提供了一套接口ApplicationContext,更加侧重于将BeanFactory放在一个上下文中来使用,这样方便在其基础上做一些扩展。

spring Bean加载(BeanFactory)

前面梳理了BeanDefinition的解析注册,接下来就是如何利用BeanDefinition生产bean了,不过相比解析注册,bean的加载过程要复杂得多。主要还是针对单例场景,因为在其整个创建过程中需要考虑缓存复用,线程安全,循环依赖,以及AOP处理等问题。

下面就以beanFactory.getBean("xxx")作为入口进行分析,尽量梳理出主要的实现思路和步骤。

spring BeanDefinition解析(XmlBeanDefinitionReader)

spring从xml中解析及注册BeanDefinition的过程主要由XmlBeanDefinitionReader主导,其相当于一个组织者的角色,将解析的工作委托给BeanDefinitionDocumentReader,注册工作则分配给BeanDefinitionRegistry

在真正开始BeanDefinition解析前,它将自己以及ResourceReaderEventListener等接口打包成XmlReaderContext,然后交给BeanDefinitionDocumentReader,以便在解析过程中可以回调ReaderEventListener中的事件接口。

在完成BeanDefinition解析时,会调用BeanDefinitionRegistry进行注册,实际上当所有BeanDefinition注册完成时,它的使命也就结束了,剩下事情的就交给BeanFactory了。

根据上面的理解,我们大概可以画出它们之间的UML关系: