Spring 通过xml配置文件描述bean直接的依赖关系,利用反射技术实例化bean并建立bean之间的依赖。Spring DI容器在这个基础上 实现 bean的缓存 事务 代理 生命周期 等高级服务;IOC中最核心的接口是Beanfactory提供IOC的高级服务,而ApplicationContext是建立在BeanFactory基础之上提供抽象的面向应用的服务。
从beanfactory的体系结构体系结构图可以看出,beanFactory 功能在不同的接口中不断的扩展,下面对主要几个接口的功能进行说明:
1.beanFactory 最顶层的接口,主要提供getBean(String beanName)方法 获取bean
2.ListableBeanFactory 该接口定义访问容器中bean的相关方法 如 容器中bean的个数 某个指定bean在容器中的配置名称 以及容器是否包含某个bean 等方法
3.ConfigurableBeanFactory 增强ioc容器的可定制性 如属性编辑器,容器初始化后置处理器等等方法
4. AutowireCapableBeanfactory 支持bean自动装载 如 按包扫描等等 注解bean 等等
5. SingletonBeanRegistry 定义运行时想容器注册单例的方法
6.BeanDefinitionRegistry 在spring配置文件xml中 每一个Bean 节点元素在容器中都通过一个BeanDefinition对象表示,该接口提供想容器手工注册BeanDefinition对象的方法。
BeanFactory初始化过程:
Spring为beanFactory提供了多种实现常用的是XmlBeanFactory。beanFactory通过Spring 提供的Resource工具包加载xml配置文件并启动IOC容器。在IOC容器启动的时候并不立即初始化xml中定义的bean,当第一次调用该bean的时候再进行初始化工作(懒加载),同时beanFacotory也会缓存初始化后得bean实例,在之后的调用的时候 直接从缓存中获取。
注: spring 在SingletonBeanRegistry 接口的实现类 DefaultSingletonBeanRegistry 中定义了一个HashMap 实例,以beanname作为key保存实例化后的Bean。
2.ApplicationContext 体系结构
ApplicationContext主要实现类为ClassPathXmlApplicationContext 和FileSystemXmlApplicationContext,同样的ApplicationContext 通过集成多个接口以扩展相应的功能,从上图中可以看到ApplicationContext 同时继承了ListableBeanFactory 和HierarchicalBeanFactory接口,在此基础上也继承了其他接口进一步扩展了Beanfactory的功能呢
1.ApplicationEventPublisher 让容器拥有发布上下文事件的能力 如容器关闭,启动事件
2.MessageSource 为容器提供i18n国际化消息访问功能
3,ResourcepatternResolver 路径匹配解析器 为 容器提供路径解析查询的功能 支持ant风格的路径匹配
4.LifeCycle 该接口提供 start()和stop()两个方法用于控制异步处理程序,ApplicationContext和和相关具体的bean均要实现该接口,ApplicationContext 通过start/stop 方法将消息传递给所有的实现该接口的bean已达到管理控制jmx 日志调度等目的
ConfigurableApplicationContext 扩展与ApplicationContext接口 提供了refresh()和close()方法,用于在运行时清除缓存重新加载配置信息或者关闭ApplicationContext容器等等
3.WebApplicationContext
WebApplcationContext 是满足web应用而提供的 WebApplcationContext 和ServletContext可以相互引用以获取多方的功能,另外WebApplcationContext 的作用于又新增了三个作用于 request Session和 global session 三个作用域