网站建设,h5,小程序,众安保险,长沙优化推广外包,杭州保洁公司保洁服务一.区别
BeanFactory和ApplicationContext是Spring的两大核心接口#xff0c;都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
1.依赖关系
BeanFactory#xff1a;是Spring里面最底层的接口#xff0c;包含了各种Bean的定义#xff0c;读取bean…一.区别
BeanFactory和ApplicationContext是Spring的两大核心接口都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
1.依赖关系
BeanFactory是Spring里面最底层的接口包含了各种Bean的定义读取bean配置文档管理bean的加载、实例化控制bean的生命周期维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生除了提供BeanFactory所具有的功能外还提供了更完整的框架功能
继承MessageSource因此支持国际化。统一的资源文件访问方式。提供在监听器中注册bean的事件。同时加载多个配置文件。载入多个有继承关系上下文 使得每一个上下文都专注于一个特定的层次比如应用的web层。
2.加载方式
BeanFactroy采用的是延迟加载形式来注入Bean的即只有在使用到某个Bean时(调用getBean())才对该Bean进行加载实例化。这样我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入BeanFacotry加载后直至第一次使用调用getBean方法才会抛出异常。ApplicationContext它是在容器启动时一次性创建了所有的Bean。这样在容器启动时我们就可以发现Spring中存在的配置错误这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean通过预载入单实例bean ,确保当你需要的时候你就不用等待因为它们已经创建好了相对于基本的BeanFactoryApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时程序启动较慢。
3.创建方式
BeanFactory通常以编程的方式被创建
ApplicationContext还能以声明的方式创建如使用ContextLoader。
4.注册方式
BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用但两者之间的区别是BeanFactory需要手动注册而ApplicationContext则是自动注册。
二.关系
1.“低级容器”与“高级容器”
Spring 作者 Rod Johnson 设计了两个接口用以表示容器;
BeanFactoryApplicationContext
BeanFactory 简单粗暴可以理解为就是个 HashMapKey 是 BeanNameValue 是 Bean 实例。通常只提供注册put获取get这两个功能。我们可以称之为 “低级容器” ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。例如资源的获取支持多种消息例如 JSP tag 的支持对 BeanFactory 多了工具级别的支持等待。所以你看他的名字已经不是 BeanFactory 之类的工厂了而是 “应用上下文” 代表着整个大容器的所有功能。该接口定义了一个 refresh 方法此方法是所有阅读 Spring 源码的人的最熟悉的方法用于刷新整个容器即重新加载/刷新所有的bean。
2.关系梳理
使用ClassPathXmlApplicationContext 类来展示整个容器的层级 UML 关系
图片解释 最上面的是 BeanFactory下面的 3 个绿色的都是功能扩展接口 看下面的隶属 ApplicationContext 粉红色的 “高级容器”依赖着 “低级容器”这里说的是依赖不是继承哦。他依赖着 “低级容器” 的 getBean 功能。而高级容器有更多的功能支持不同的信息源头可以访问文件资源支持应用事件Observer 模式。 通常用户看到的就是 “高级容器”。 但 BeanFactory 也非常够用啦左边灰色区域的是 “低级容器”只负载加载 Bean获取 Bean。容器其他的高级功能是没有的。例如上图画的 refresh 刷新 Bean 工厂所有配置生命周期事件回调等。 3.小结
IoC 在 Spring里只需要低级容器就可以实现2 个步骤
加载配置文件解析成 BeanDefinition 放在 Map 里。调用 getBean 的时候从 BeanDefinition 所属的 Map 里拿出Class 对象进行实例化同时如果有依赖关系将递归调用 getBean 方法 —— 完成依赖注入。
上面就是 Spring 低级容器BeanFactory的 IoC。 至于高级容器 ApplicationContext他包含了低级容器的功能当他执行refresh 模板方法的时候将刷新整个容器的 Bean。同时其作为高级容器包含了太多的功能。一句话他不仅仅是 IoC。他支持不同信息源头支持BeanFactory 工具类支持层级容器支持访问文件资源支持事件发布通知支持接口回调等等。
三.ApplicationContext通常的实现
FileSystemXmlApplicationContext 此容器从一个XML文件中加载beans的定义XML Bean 配置文件的全路径名必须提供给它的构造函数。ClassPathXmlApplicationContext此容器也从一个XML文件中加载beans的定义这里你需要正确设置classpath因为这个容器将在classpath里找bean配置。WebXmlApplicationContext此容器加载一个XML文件此文件定义了一个WEB应用的所有bean。