Spring框架系列(三)--Bean的作用域和生命周期

本文内容纲要:

- Bean的作用域

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

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

本文内容总结:Bean的作用域,Bean的生命周期,

原文链接:https://www.cnblogs.com/huigelaile/p/10975128.html

以上是 Spring框架系列(三)--Bean的作用域和生命周期 的全部内容, 来源链接: utcz.com/z/362413.html

回到顶部