• BeanFactory和ApplicationContext的区别总结


    BeanFactory:
    是Spring里面最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
    ApplicationContext:
    应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;

    • 1) 国际化(MessageSource)
    • 2) 访问资源,如URL和文件(ResourceLoader)
    • 3) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
    • 4) 消息发送、响应机制(ApplicationEventPublisher)
    • 5) AOP(拦截器)

    两者装载bean的区别
    BeanFactory:BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
    ApplicationContext:ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
    我们该用BeanFactory还是ApplicationContent
    延迟实例化的优点:(BeanFactory)

    • 应用启动的时候占用资源很少;对资源要求较高的应用,比较有优势;

    不延迟实例化的优点: (ApplicationContext)

    • 1. 所有的Bean在启动的时候都加载,系统运行的速度快;
    • 2. 在启动的时候所有的Bean都加载了,我们就能在系统启动的时候,尽早的发现系统中的配置问题
    • 3. 建议web应用,在启动的时候就把所有的Bean都加载了。(把费时的操作放到系统启动中完成)

    BeanFactory类关系继承图

    1. BeanFactory类结构体系:
    BeanFactory接口及其子类定义了Spring IoC容器体系结构,由于BeanFactory体系非常的庞大和复杂,因此要理解Spring IoC,需要先理清BeanFactory的继承机构。

     

    2. ApplicationContext的结构体系:
    ApplicationContext接口是一个BeanFactory基础上封装了更多功能的,Spring中最为常用的IoC容器,其包含两个子接口:ConfigurableApplicationContext、WebApplicationContext。
    ConfigurableApplicationContext其结构体系如下:

    详细的结构体系如下:
    a.AbstractApplicationContext结构体系如下:

    b.ConfigurablePortletApplicationContext体系结构如下:

    c.ConfigurableWebApplicationContext结构体系如下:

    2).WebApplicationContext体系结构如下:

    1、容器是spring的核心,使IoC管理所有和组件
    2、spring的两种容器:

    • a、BeanFactoy
    • b、ApplicationContext应用上下文

    3、BeanFactory:BeanhFactory使用延迟加载所有的Bean,为了从BeanhFactory得到一个Bean,只要调用getBean()方法,就能获得Bean
    4、ApplicationContext:

    • a、提供文本信息解析,支持I18N
    • b、提供载入文件资源的通用方法
    • c、向注册为监听器的Bean发送事件
    • d、ApplicationContext接口扩展BeanFactory接口
    • e、ApplicationContext提供附加功能

    5、ApplicationContext的三个实现类:

    • a、ClassPathXmlApplication:把上下文文件当成类路径资源
    • b、FileSystemXmlApplication:从文件系统中的XML文件载入上下文定义信息
    • c、XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息

    6、在默认情况下,Bean全都是单态,在<bean>中的singleton为false
    7、<bean>中的id属性必须遵循Java规范,而name属性可以不遵循
    8、Bean的实例化的时候需要一些初始化的动作,同样当不再使用的时候,需要从容器中将其销毁
    9、对象的初始化:<beaninit-method="方法名">
    10、对象的销毁:<beandestroy-method="方法名">,销毁对象的过程:

    • a、主线程先被中断
    • b、Java虚拟机使用垃圾回收机制回收Bean对象

    Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类。事实上,Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。二者对Bean的初始化也有很大区别。BeanFactory当需要调用时读取配置信息,生成某个类的实例。如果读入的Bean配置正确,则其他的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,如果配置文件没有错误,就创建所有的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
    ApplicationContext会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而BeanFactory需要在代码中通过手工调用addBeanPostProcessor()方法进行注册。
    Bean装配实际上就是让容器知道程序中都有哪些Bean,可以通过以下两种方式实现:
    配置文件(最为常用,体现了依赖注入DI的思想)
    编程方式(写的过程中向BeanFactory去注册)
    作用:
    1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
    2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
    a. 国际化支持
    b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
    c. 事件传递:通过实现ApplicationContextAware接口
    3. 常用的获取ApplicationContext的方法:
    FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组
    ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
    WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现

    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
    <servlet-name>context</servlet-name>
    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

    这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/myApplicationContext.xml</param-value>
    </context-param>
    郭慕荣博客园
  • 相关阅读:
    C,C++,VC++有什么区别
    RF & Microarray
    偏最小二乘法
    各种机器学习方法的优缺点
    纠错输出编码法ECOC
    遗传算法GA
    支持向量机SVM
    神经网络NN
    机器学习的基本概念
    SPI通信协议(SPI总线)学习
  • 原文地址:https://www.cnblogs.com/jelly12345/p/15341951.html
Copyright © 2020-2023  润新知