一文搞懂Spring Bean中的作用域和生命周期

下面是详细讲解“一文搞懂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的各个方法:

  1. Bean被实例化(默认构造函数或工厂方法)
  2. Bean属性(依赖)被注入
  3. 如果Bean实现了BeanNameAware接口,会调用setBeanName()方法传入Bean的ID。
  4. 如果Bean实现了BeanFactoryAware接口,会调用setBeanFactory()方法传入BeanFactory实例。
  5. 如果Bean实现了ApplicationContextAware接口,会调用setApplicationContext()方法传入ApplicationContext实例。
  6. 如果Bean实现了BeanPostProcessor接口,会调用postProcessBeforeInitialization()方法。
  7. 调用Bean的初始化方法(如果Bean实现了InitializingBean接口,则调用afterPropertiesSet()方法;如果Bean在配置文件中通过init-method属性指定了初始化方法,则调用该方法)。
  8. 如果Bean实现了BeanPostProcessor接口,会调用postProcessAfterInitialization()方法。
  9. Bean可以使用了。
  10. 当容器关闭时,调用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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    Java Fluent Mybatis 项目工程化与常规操作详解流程篇 Java Fluent Mybatis 是一个基于 Mybatis 的 fluent 动态 SQL 构建器,可以帮助我们快速生成复杂的 SQL 语句。下面我们将详细讲解 Java Fluent Mybatis 项目工程化与常规操作的流程。 一、创建项目 首先,我们需要创建一个 Maven…

    Java 2023年5月20日
    00
  • Android编程之匿名内部类与回调函数用法分析

    Android编程之匿名内部类与回调函数用法分析 什么是匿名内部类 匿名内部类是一种没有类名的内部类,直接使用new来创建,并且实现了某个接口或者继承了某个类。使用场景通常是在需要实现较为简单的接口或者重写某个类中的方法时使用,避免了创建过多的类文件。 如何使用匿名内部类实现回调函数 在Android编程中,回调函数通常用于实现异步处理,将处理结果返回给调用…

    Java 2023年5月26日
    00
  • 什么是标记-复制算法?

    以下是关于标记-复制算法的详细讲解: 什么是标记-复制算法? 标记-复制算法是一种常见的垃圾回收算法。它的原理是将内存空间分为两个区域,一部分为活动区,一部分为闲置区。在程序运行程中,标记所有不再使用的内存空间,然后将所有活动区的对象复制到闲置区,最后清空动区,从而回收内存空间。标记-复制算法分两个阶段:标记阶段和复制阶段。 标记阶段 在标记阶段,垃圾回收器…

    Java 2023年5月12日
    00
  • javaweb实现文件上传与下载功能

    请看以下内容: javaweb实现文件上传与下载功能攻略 1. 上传功能的实现 1.1 前端的实现 上传功能需要用户选择文件,并将文件发送到后台。我们可以通过HTML表单及其相关API来实现此功能。以下是一段HTML代码片段,用于实现文件上传输入框: <form action="/upload" method="post&…

    Java 2023年5月20日
    00
  • Java实现从jar包中读取指定文件的方法

    当我们需要从Java的一个jar包中读取指定的文件时,可以采用以下的几种方法,下面将针对每种方法进行详细讲解。 方法一:使用ClassLoader.getResourceAsStream()方法 该方法可以从一个jar包中直接读取文件的输入流,可以通过下面的步骤来实现: 确定需要读取的文件名,如 config.properties。 获取到当前线程的Clas…

    Java 2023年5月19日
    00
  • java遇到微信小程序 “支付验证签名失败” 问题解决

    下面是详细讲解“java遇到微信小程序 “支付验证签名失败” 问题解决”的完整攻略: 问题原因 在进行微信小程序支付时,如果出现“支付验证签名失败”的提示,一般是由于使用了错误的签名方式或者参数传递不正确。 解决方法 1. 首先确认参数传递是否正确 在进行支付前,需要将相关的参数传递给后端进行处理,并作为请求参数发送至微信支付平台。在此过程中,可能会出现参数…

    Java 2023年5月23日
    00
  • 面试官问如何启动Java 线程

    启动Java线程有两种方式:继承Thread类和实现Runnable接口。下面分别讲解这两种方式的启动步骤。 继承Thread类启动线程 步骤 继承Thread类并重写其run()方法 创建Thread类的实例对象 调用start()方法启动线程 示例 下面是一个继承Thread类的简单示例: public class MyThread extends Th…

    Java 2023年5月27日
    00
  • spring security在分布式项目下的配置方法(案例详解)

    下面为大家详细讲解Spring Security在分布式项目下的配置方法。 1、什么是Spring Security Spring Security 是一个基于 Spring 为后台应用程序提供认证和授权的框架,支持常见的认证和授权技术,并且易于扩展。它能够保护 Web 应用程序及其服务,提供认证和授权相关的附加功能,如密码编码、Single Sign On…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部