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声明了

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

  • 相关阅读:
    开心网注册详解和邀请码发放
    3COM 905TX 配置
    SQL使用
    JDBC的使用
    kiko日记几个月以来工作总结2010 1124
    talk about the history of JAZZ
    这几个月的工作任务
    工作间期的不足
    转: mac使用nvm管理多个版本node
    负载均衡与ssl证书
  • 原文地址:https://www.cnblogs.com/huigelaile/p/10975128.html
Copyright © 2011-2022 走看看