spring的应用已经越来越广泛了,而Spring IOC在spring中的地位是不可撼动的,在某种角度已经超越了AOP。很多人一提IOC,便张口就来:控制反转。究竟哪些方面被反转了呢?答案是依赖对象的获得被反转了。很多时候,我们通过多个对象之间的协作来完成一个功能,如果获取所依赖对象靠自身来实现,这将导致代码的耦合度高和难以测试。当然,控制反转还有一个好听的名字:依赖注入。
Spring IOC通过引入xml配置,由IOC容器来管理对象的生命周期,依赖关系等。
类结构图
整体结构图:
ClassPathXMLApplicationContext:IOC注入的入口类,提供了读取xml配置文件加载bean到容器的实现方式。
AbstractXmlApplicationContext:主要是解析bean文件方法,具体的解析实现在其他类中。
AbstractRefreshableConfigApplicationContext:没有更多的实现,主要是对bean配置文件进行文件的路径进行解析。
AbstractRefreshableApplicationContext:主要是对容器进行刷新操作。包括当进行重新加载bean文件到容器之前进行容器销毁工作;初始化容器bean工厂DefaultListableBeanFactory;加载配置文件的bean。
AbstractApplicationContext:IOC注入的核心处理类,实现了操作上下文的通用方法。通过模板方法的方式,做refresh容器操作,包括了包括解析bean文件,注册bean注入到bean工厂,注册监听等。具体的实现由子类进行实现。
ConfigurableApplicationContext:此接口定义了容器和上下文相关的通用方法,如刷新容器,获取bean工厂。
ApplicationContext:定义操作上下文的通用方法,如获取启动时间等。
ListableBeanFactory:定义操作Bean工厂的通用方法(可列举的bean工厂)。包括获取当前bean工厂的所以bean实例;当前bean工厂的bean数量等等。其默认实现类为DefaultListableBeanFactory。
HierarchicalBeanFactory:有层级的bean工厂。
BeanFactory:最顶层接口,定义了bean工厂的通用方法,包括获取单个bean实例;判断是否为单例模式的bean实例等。
处理流程
核心类介绍
BeanDefinition:定义了bean通用属性及get、set方法。
AbstractBeanDefinition:实现了BeanDefintion接口,定义了bean的通用属性。
RootBeanDefinition:继承于AbstractBeanDefinition类,提供了一些构造方法供实例化。
GenericBeanDefinition:继承于AbstractBeanDefinition类,提供了一些构造方法供实例化。与RootBeanDefinition的不同之处就在于可以设置和获取父类bean的名字。
PathMatchingResourcePatternResolver:提供了读取资源文件的方式,支持classpath:前缀读取单个资源文件和classptah*:前缀读取下的一组资源文件。最终会返回Resource[]。