spring Aop
使用面向对象(OOP)编程有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时(例如日志、安全检测等),只能在每个对象里引用公共行为,这样程序中就产生了大量重复的代码,不便于维护,所以可以使用面向切面(AOP)编程作为一个补充,Aop是横向的而OOP是纵向的。
使用面向对象(OOP)编程有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时(例如日志、安全检测等),只能在每个对象里引用公共行为,这样程序中就产生了大量重复的代码,不便于维护,所以可以使用面向切面(AOP)编程作为一个补充,Aop是横向的而OOP是纵向的。
前面介绍bean加载时都是站在BeanFactory
的角度上进行的,相当于将spring纯粹当成一个bean容器工具来使用。其实spring另外提供了一套接口ApplicationContext
,更加侧重于将BeanFactory
放在一个上下文中来使用,这样方便在其基础上做一些扩展。
前面梳理了BeanDefinition
的解析注册,接下来就是如何利用BeanDefinition
生产bean了,不过相比解析注册,bean的加载过程要复杂得多。主要还是针对单例场景,因为在其整个创建过程中需要考虑缓存复用,线程安全,循环依赖,以及AOP处理等问题。
下面就以beanFactory.getBean("xxx")
作为入口进行分析,尽量梳理出主要的实现思路和步骤。
上一篇梳理了XmlBeanDefinitionReader
解析注册BeanDefinition
的过程,但主要是针对默认标签的解析,这里主要介绍下其对于自定义标签的解析策略。
spring从xml中解析及注册BeanDefinition
的过程主要由XmlBeanDefinitionReader
主导,其相当于一个组织者的角色,将解析的工作委托给BeanDefinitionDocumentReader
,注册工作则分配给BeanDefinitionRegistry
。
在真正开始BeanDefinition
解析前,它将自己以及Resource
,ReaderEventListener
等接口打包成XmlReaderContext
,然后交给BeanDefinitionDocumentReader
,以便在解析过程中可以回调ReaderEventListener
中的事件接口。
在完成BeanDefinition
解析时,会调用BeanDefinitionRegistry
进行注册,实际上当所有BeanDefinition
注册完成时,它的使命也就结束了,剩下事情的就交给BeanFactory
了。
根据上面的理解,我们大概可以画出它们之间的UML关系: