zoukankan      html  css  js  c++  java
  • Spring框架系列(三)--Bean的作用域和生命周期

    Bean的作用域

    Spring应用中,对象实例都是在Container中,负责创建、装配、配置和管理生命周期(new到finalize())

    Spring Container分为两种:

      1、BeanFactory:提供DI支持

      2、ApplicationContext:基于BeanFactory构建,提供应用框架级别的服务

    ApplicationContext实现类

      1、AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文

      2、AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文

      3、ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源

      4、FileSystemXmlapplicationcontext从文件系统下的一个或多XML配置文件中加载上下文定义

      5、XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义

    加载上下文的方式都很相似:都是直接new。例如:ApplicationContext applicationContext = new ClassPathXmlApplicationContext

    ("applicationContext.xml"); 之后就是调用应用上下文的getBean()获取bean

    Spring作用域:

      1、单例Singleton:在整个应用中,只创建bean的一个实例,在IOC容器中共享,容器创建的时候就实例化了这个bean

      2、原型Prototype:每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例,相当于每次都new bean(),容器创建的

    时候没有实例化了bean,而是请求获取的时候才会创建对象

      3、会话Session:只是在Web应用中,为每个http session创建一个bean实例

      4、请求Rquest:只是在Web应用中,为每个http请求创建一个bean实例,这个bean实例只在当前request请求内有效,请求结束的时候,这个

    bean实例被销毁

      5、全局会话GlobalSession:只是在Web应用中使用,仅在使用portlet context的时候有效

    1、Singleton:

    默认为Singleton,对于无状态的bean可以使用单例,如果使用非单例,通过@Scope设置

    无状态Bean:

      无状态是指没有成员变量,例如service、dao,虽然service里面有dao,但是dao是没有状态的

      有状态是指有成员变量,例如controller内部一般有类似UserDTO的有状态bean,所以一般使用prototype

    容器实例化的时候就会初始化bean,可以通过lazy-init="true"/@Lazy设置延迟加载,当第一次获取bean的时候进行初始化

    @Lazy(true)
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class Student {    }

    2、Prototype:

    scope使用Prototype,默认懒加载,即等到获取bean的时候进行初始化,而不是容器实例化的时候

    当容器关闭的时候,destroy()不会被执行

    Bean的生命周期

    流程:

      1、Spring对bean进行实例化

      2、Spring将值和bean的引用注入到bean对应的属性中

      3、如果bean实现了BeanNameAware接口, Spring将bean的ID传递给setBeanName()

      4、如果bean实现了BeanFactoryAware接口, Spring将调用setBeanFactory(),将BeanFactory容器实例传入

      5、如果bean实现了ApplicationContextAware接口, Spring将调用setApplicationContext(),将bean所在的应用上下文的引用传入

    进来

      6、如果bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessBeforeInitialization()

      7、如果bean实现了InitializingBean接口, Spring将调用它们的afterPropertiesSet()。类似地,如果bean使用init-method声

    明了初始化方法,该方法也会被调用

      8、如果bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessAfterInitialization()

      9、此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁

      10、如果bean实现了DisposableBean接口, Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了

    毁方法,该方法也会被调用

  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/huigelaile/p/10975128.html
Copyright © 2011-2022 走看看