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

时间:2023-03-08 16:11:34

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的生命周期

Spring框架系列(三)--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声明了

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