简介
Spring通过一份配置文件描述Bean与Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。
Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务
区别
BeanFactory是Spring框架最核心的接口,它提供了高级IoC的配置机制。
ApplicationContext是建立在BeanFactory之上的,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建应用
BeanFactory是Spring框架的基础设施,面向Spring本身,ApplicationContext面向使用Spring框架的应用开发者
BeanFactory
BeanFactory是一个类工厂,创建并管理各种类的对象
BeanFactory的初始化
- 资源装载器装载资源配置文件(根据前缀动态选择合适的Resource实现类,然后生成对应的实例对象)得到Resource,然后XmlBeanDefinitionReader通过Resource装载Spring配置信息并启动IoC容器,然后通过getBean方法从IoC容器中获取Bean。
- 通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时。
- 对于单实例的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean方法调用时,是从IoC容器的缓存中直接取出的
- Spring在DefaultSingletonBeanRegistry类中提供了一个用于缓存单实例Bean的缓存器,用HashMap实现,key为beanName
ApplicationContext
- ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能,在BeanFactory中很多要以编程实现的功能,在ApplicationContext中可以通过配置的方式实现
- ApplicationContext继承了ListableBeanFactory和HierarchicalBeanFactory这两个在BeanFactory中扩展的接口,除此之外还通过多个其他接口扩展BeanFactory的功能
- ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者是从类路径中加载配置文件,后者是从文件系统加载配置文件,
ApplicationContext初始化:
直接new ClassPathXmlApplicationContext/FileSystemXmlApplicationContext(路径名)
区别:ApplicationContext在初始化应用上下文时就实例化所有单实例的Bean,因此ApplicationContext初始化时间会比BeanFactory初始化时间长一些,不过稍后的调用就没有“第一次惩罚”的问题
Bean的配置方式
- xml文件配置
- 注解类配置
- Groovy DSL进行Bean定义配置