【深入学习Spring】2——BeanFactory体系结构(BeanFactory和ApplicationContext)
BeanFactory体系结构
上面是BeanFactory的体系图,其有两个主要分支:
①一条是右侧部分的BeanFactory到最后的XmlBeanFactory这条分支。
该分支是IOC容器的底层设计,最后的DefaultListableBeanFactory则是spring提供给我们的作为默认的功能完整的底层容器来使用。该类还有个子类XmlBeanFactory,顾名思义是以XML配置方式来使用,但从Spring3.1开始XmlBeanFactory被标记为了过时的类,并推荐我们直接使用DefaultListableBeanFactory,配合XmlBeanDefinitionReader一起使用。
ClassPathResource resource = new ClassPathResource("classpath:com/lp/bean.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); //加载Bean定义 reader.loadBeanDefinitions(resource); //获取Bean User user = (User) factory.getBean("user"); System.out.println(user.getName());
②另外一条分支就是左侧的BeanFactory到ApplicationContext,到左侧WebApplicationContext到XmlWebApplicationContext,或者到右侧的AbstractApplicationContext到我们所熟知的AnnotationConfigApplicationContext、ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigWebApplicationContext。
BeanFactory和ApplicationContext的区别
官方文档:7.16.1 BeanFactory or ApplicationContext?
Spring提供了两种容器类型:BeanFactory和ApplicationContext。BeanFactory属于底层容器,提供了基本的DI支持。而ApplicationContext是基于BeanFactory构建的高级容器,除了具有BeanFactory的全部功能外,还有AOP,事务,国际化,消息源以及应用程序事件处理等功能。
- BeanFactory:基础类型IoC 容器,提供完整的IoC 服务支持。如果没有特殊指定,默认采用延迟初始化策略(lazy-load )。只有当客户端对象需要访问(getBean)容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需要的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IoC 容器选择。
- ApplicationContext:ApplicationContext在BeanFactory的基础上构建,是相对比较高级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后默认全部初始化并绑定完成。所以,相对于BeanFactory来说,ApplicationContext要求更多的系统资源,同时,因为在启动时就完成所有初始化,容器启动时间较之BeanFactory也会长一些。在那些系统资源充足并且要求更多功能的场景中,ApplicationContext类型的容器是比较合适的选择。