下面是详细讲解“一文搞懂Spring Bean中的作用域和生命周期”的完整攻略。
什么是Spring Bean
在讲解Spring Bean的作用域和生命周期之前,我们需要先了解什么是Spring Bean。
Spring Bean是指通过Spring IoC容器管理的对象,它们是应用程序的核心组件之一。在Spring的世界里,Bean是指一个由Spring IoC容器实例化、配置和管理的对象。Spring IoC容器负责将Bean注入到应用程序中,让它们相互协作,驱动整个应用程序运行。
Spring Bean的作用域
Spring Bean的作用域指的是在何时创建Bean以及何时销毁Bean。
Spring提供了以下5种常见的Bean作用域:
singleton
singleton是默认的作用域,它指的是一个Bean在整个应用程序中只有一个实例,由Spring IoC容器来管理。如果多个Bean依赖同一个Bean,它们将共享同一个实例。
在Java配置方式下,在@Bean注解中添加@Scope("singleton")来设置Bean的作用域为singleton。
示例代码:
@Configuration
public class AppConfig {
@Bean
@Scope("singleton")
public MyBean myBean() {
return new MyBean();
}
}
prototype
prototype指的是每次从Spring IoC容器中获取Bean时都会创建它的一个新实例。如果多个Bean依赖同一个Bean,它们将使用不同的实例。
在Java配置方式下,在@Bean注解中添加@Scope("prototype")来设置Bean的作用域为prototype。
示例代码:
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public MyBean myBean() {
return new MyBean();
}
}
request
request指的是每次HTTP请求都会创建一个新的实例,用于处理当前请求。
在Java配置方式下,在@Bean注解中添加@Scope("request")来设置Bean的作用域为request。
示例代码:
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Bean
@Scope("request")
public MyHandler myHandler() {
return new MyHandler();
}
}
session
session指的是每个HTTP会话都会创建一个新的实例,用于处理当前会话。
在Java配置方式下,在@Bean注解中添加@Scope("session")来设置Bean的作用域为session。
示例代码:
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Bean
@Scope("session")
public MySessionBean mySessionBean() {
return new MySessionBean();
}
}
global session
global session指的是每个全局HTTP会话都会创建一个新的实例。
在Java配置方式下,在@Bean注解中添加@Scope("globalSession")来设置Bean的作用域为global session。
示例代码:
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Bean
@Scope("globalSession")
public MyGlobalSessionBean myGlobalSessionBean() {
return new MyGlobalSessionBean();
}
}
Spring Bean的生命周期
Spring Bean的生命周期指的是Bean从创建、使用到销毁的过程。
Spring IoC容器在创建Bean时会按照下面的顺序调用Bean的各个方法:
- Bean被实例化(默认构造函数或工厂方法)
- Bean属性(依赖)被注入
- 如果Bean实现了BeanNameAware接口,会调用setBeanName()方法传入Bean的ID。
- 如果Bean实现了BeanFactoryAware接口,会调用setBeanFactory()方法传入BeanFactory实例。
- 如果Bean实现了ApplicationContextAware接口,会调用setApplicationContext()方法传入ApplicationContext实例。
- 如果Bean实现了BeanPostProcessor接口,会调用postProcessBeforeInitialization()方法。
- 调用Bean的初始化方法(如果Bean实现了InitializingBean接口,则调用afterPropertiesSet()方法;如果Bean在配置文件中通过init-method属性指定了初始化方法,则调用该方法)。
- 如果Bean实现了BeanPostProcessor接口,会调用postProcessAfterInitialization()方法。
- Bean可以使用了。
- 当容器关闭时,调用Bean的销毁方法(如果Bean实现了DisposableBean接口,则调用destroy()方法;如果Bean在配置文件中通过destroy-method属性指定了销毁方法,则调用该方法)。
Spring Bean 生命周期示例
下面我们来看一些Spring Bean 生命周期的示例。
1. 初始化方法和销毁方法
假设我们有一个名为MyBean的Bean,我们希望在Bean创建后调用一个初始化方法,在Bean销毁前调用一个销毁方法。
一个简单的方法是,在MyBean类中添加方法来实现初始化和销毁逻辑,并在Bean配置文件中通过init-method和destroy-method指定初始化方法和销毁方法。
示例代码:
public class MyBean {
// 初始化方法
public void init() {
System.out.println("MyBean 初始化方法被调用");
}
// 销毁方法
public void destroy() {
System.out.println("MyBean 销毁方法被调用");
}
}
Bean配置文件:
<beans>
<bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="destroy"/>
</beans>
2. 使用接口实现初始化逻辑
假设我们有一个名为MyBean的Bean,我们希望在Bean创建后调用一个初始化方法。我们可以实现InitializingBean接口,并重写afterPropertiesSet()方法来实现初始化逻辑。
示例代码:
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyBean 初始化方法被调用");
}
}
Bean配置文件:
<beans>
<bean id="myBean" class="com.example.MyBean"/>
</beans>
3. 使用接口实现销毁逻辑
假设我们有一个名为MyBean的Bean,我们希望在Bean销毁前调用一个销毁方法。我们可以实现DisposableBean接口,并重写destroy()方法来实现销毁逻辑。
示例代码:
public class MyBean implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("MyBean 销毁方法被调用");
}
}
Bean配置文件:
<beans>
<bean id="myBean" class="com.example.MyBean"/>
</beans>
4. 使用@Bean注解实现初始化逻辑
假设我们有一个名为MyBean的Bean,我们希望在Bean创建后调用一个初始化方法。我们可以在Java配置方式下,在@Bean注解中添加initMethod属性来指定初始化方法。
示例代码:
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public MyBean myBean() {
return new MyBean();
}
}
5. 使用@Bean注解实现销毁逻辑
假设我们有一个名为MyBean的Bean,我们希望在Bean销毁前调用一个销毁方法。我们可以在Java配置方式下,在@Bean注解中添加destroyMethod属性来指定销毁方法。
示例代码:
@Configuration
public class AppConfig {
@Bean(destroyMethod = "destroy")
public MyBean myBean() {
return new MyBean();
}
}
以上就是Spring Bean中作用域和生命周期的详细讲解,以及相关示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Spring Bean中的作用域和生命周期 - Python技术站