当我们在使用Spring框架的时候,Bean是必不可少的组件之一,它们是构成应用程序的核心基础。在本篇文章中,我将会深入探讨Spring中的Bean的作用域和生命周期相关的知识点,包括不同作用域的分类以及Bean存在的生命周期,希望读者通过本篇文章可以获得对于Spring中Bean作用域和生命周期的更深入的认识。
什么是Bean的作用域?
Bean的作用域指的是Bean在Spring IoC容器中存在的范围,也就是Bean对象的创建和销毁的策略,Spring默认提供了5种作用域范围,分别是:
- singleton(单例模式)
- prototype(原型模式)
- request
- session
- globalSession
Singleton
singleton是Spring中默认的作用域,它在整个应用中只有一个实例。Spring容器启动时创建Bean实例,对于所有请求,容器都返回同一个实例。Singleton作用域在应用程序中非常常见,尤其是只需要一个实例的情况下。在配置中使用singleton作用域可以节省资源并提高性能。
示例:
<bean id="exampleBean" class="com.example.ExampleBean" scope="singleton"/>
Prototype
prototype作用域表示每个请求都会创建新的实例。也就是说它能够保证每次调用都有一个新的Bean实例,适用于不同的应用场景,例如重量级的业务逻辑,临时状态的缓存等。
示例:
<bean id="exampleBean" class="com.example.ExampleBean" scope="prototype"/>
Request
request作用域是指当创建一个web应用程序请求时,Spring容器会为每个请求都创建一个单独的Bean实例。这种作用域的Bean适用于在web应用程序中使用。Spring容器会在每个HTTP请求到达时返回一个新的Bean实例。request作用域除了只有在web环境下才有用外,其作用与prototype作用域类似。
示例:
<bean id="exampleBean" class="com.example.ExampleBean" scope="request"/>
Session
session作用域在web环境下表示该Bean实例与HTTP会话相关联。也就是说,在同一个HTTP会话中,每次请求都返回相同的Bean实例。每当一个HTTP会话新创建时,则会创建新的Bean实例。处于session作用域下的Bean必须在web environment下的应用中使用,如果Bean是从session作用域获取但当前环境并非web的,则会有NoSuchBeanDefinitionException异常。
示例:
<bean id="exampleBean" class="com.example.ExampleBean" scope="session"/>
Global Session
全局会话作用域(global session),在一些基于portlet的web应用中使用。当portlet被渲染时,一个新的HTTP会话会被创建,如果作用域为全局会话时,则保证在整个应用中只有一个全局会话的Bean实例存在。
示例:
<bean id="exampleBean" class="com.example.ExampleBean" scope="globalSession"/>
什么是Bean的生命周期?
当一个Bean默认实例化后,它必须经历一系列的阶段,包括初始化和销毁的过程。这些阶段被称作Bean的生命周期,Spring IoC容器会负责执行这些阶段的操作。Bean的生命周期主要包括以下几个阶段:
- 实例化
- 属性填充
- 初始化
- 完成
- 销毁
实例化
实例化是Bean的第一阶段,也就是创建Bean实例的过程。
当容器首次启动时,会依据每个Bean定义中的class属性来生成一个Bean实例。这个实例化的过程大致可以拆分为如下几步:
- 根据Bean定义中的class属性,使用Java反射机制创建一个对象。
- 根据Bean定义中的构造函数和参数,调用这个对象的一个合适的构造函数。
- 如果Bean定义中指定了属性setter方法,容器会根据这些setter方法为对象进行属性注入。
属性填充
属性填充阶段是指在实例化完成之后,对Bean的属性进行赋值的过程。具体来说,Spring容器会在实例化Bean之后,将Bean定义的属性或依赖注入到上下文中保存的Bean对象中。属性的填充通常发生在setter方法中。
初始化
初始化是指在构造器之后且所有属性被设置后,应用程序需要执行的一段预处理过程,主要包括以下几种方式:
- 定义了init方法:在Bean实例化后设置Bean的一些默认值,这个方法的实现可以自定义。
- 实现了InitializingBean接口:容器会自动回调这个Bean的afterPropertiesSet()方法,在方法中实现初始化操作。
- 带有@PostConstruct注解的方法:这个方法会在Bean的属性被注入后立即调用。
完成
完成阶段是指Bean已经可以使用的状态。当调用getBean()方法时,Spring IoC容器会返回Bean实例对象,这个Bean状态就处于完成阶段。
销毁
在Bean实例不再被需要时,我们需要销毁Bean实例。当一个Bean销毁时,容器会回调它的一些特定方法来释放它所使用的资源,主要包括以下几种方式:
- 定义了destory方法:在Bean实例被销毁前设置Bean的一些默认值,这个方法的实现可以自定义。
- 实现了DisposableBean接口:容器会自动回调这个Bean的destory()方法,在方法中实现销毁操作。
- 带有@PreDestroy注解的方法:这个方法会在Bean销毁之前调用。
总结
在这篇文章中,我们深入了解了Spring中的Bean的作用域和生命周期。通过学习不同作用域的分类以及Bean存在的生命周期,我们可以更好的理解Spring框架的核心组件Bean,掌握Bean的相关知识点并应用在各个需要的场景中,为我们的开发工作提供更多的便利,从而提高应用程序的性能优化和维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解Spring中Bean的作用域和生命周期 - Python技术站