zoukankan      html  css  js  c++  java
  • 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)

    BeanFactory和ApplicationContext

    Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类。

    Spring提供了两种不同的容器:

      一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。

    BeanFactory 仅提供了最基本的依赖注入支持

     ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。

    实例化这两种容器时是有区别的:

    1、BeanFactory

    XmlBeanFactory xbf= new XmlBeanFactory(new ClassPathResource("sword.xml"));

    获取某个类的实例时如下:

    Student stu = (Student) xbf.getBean("student");

    2、ApplicationContext

    ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
    Student bDemoClass = (BeansDemoClass)context.getBean("stu");

    二者对Bean的初始化也有很大区别。

    BeanFactory当需要调用时读取配置信息,生成某个类的实例。

      如果读入的Bean配置正确

      则其他的配置中有错误也不会影响程序的运行

    而ApplicationContext 在初始化时就把 xml 的配置信息读入内存

      对 XML 文件进行检验

      如果配置文件没有错误,就创建所有的Bean  直接为应用程序服务

    。相对于基本的BeanFactory,ApplicationContext 的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

    Bean的生命周期

    一、spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext)。 

    spring 框架支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext)。 
    内置支持的作用域分列如下:

    作用域 描述

    singleton

    在每个Spring IoC容器中一个bean定义对应一个对象实例。

    prototype

    一个bean定义对应多个对象实例。

    request

    在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext 情形下有效。

    session

    在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext 情形下有效。

    global session

    在一个全局的HTTP Session 中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext 情形下有效。

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton

    不是每次都产生一个新的对象使用Singleton模式产生单一实例

    对单线程的程序说并不会有什么问题,但对于多线程的程序就必须

    防止多个线程同时存取共享资源所引发的数据不同步问题。

    然而在spring中

    可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例

     

    在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例

    一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段

    1:Bean的建立:

    容器寻找Bean的定义信息并将其实例化。

    2:属性注入:

    使用依赖注入,Spring按照Bean定义信息配置Bean所有属性

    3:BeanNameAware的setBeanName():

    如果Bean类有实现org.springframework.beans.BeanNameAware接口

    工厂调用Bean的setBeanName()方法传递Bean的ID。

    4:BeanFactoryAware的setBeanFactory():

    如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口

    工厂调用setBeanFactory()方法传入工厂自身。

    5:BeanPostProcessors的ProcessBeforeInitialization()

    如果有org.springframework.beans.factory.config.BeanPostProcessors和Bean关联

    那么其postProcessBeforeInitialization()方法将被将被调用

    6:initializingBean的afterPropertiesSet():

    如果Bean类已实现org.springframework.beans.factory.InitializingBean接口

    执行他的afterProPertiesSet()方法

    7:Bean定义文件中定义init-method

    可以在Bean定义文件中使用"init-method"属性设定方法名称

    如果有以上设置的话,则执行到这个阶段,就会执行initBean()、

    8:BeanPostProcessors的ProcessaAfterInitialization()

    如果有任何的BeanPostProcessors实例与Bean实例关联

    则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法

    此时Bean已经可以被应用系统使用,并且将保留在BeanFactory中知道它不在被使用。

    有两种方法可以将其从BeanFactory中删除掉

    1:DisposableBean的destroy()

    在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法

    2:Bean定义文件中定义destroy-method

    在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称

  • 相关阅读:
    queue
    hiho1095(二分)
    uvaliva3942(trie树)
    hiho1014(trie树)
    uvalive4329(树状数组)
    Dropping tests POJ
    linux mysql命令
    linux文件系统和mount(硬盘,win分区,光驱,U盘)
    linux共享windows资料
    linux常用命令
  • 原文地址:https://www.cnblogs.com/swordtm/p/6618496.html
Copyright © 2011-2022 走看看