一文搞懂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-synchronized 嵌套使用代码详解

    Java synchronized 嵌套使用代码详解 在Java 中使用synchronized 关键字是实现多线程同步的重要手段之一,它可以锁定共享资源,保证线程安全。有时候可能会遇到需要在方法中嵌套使用synchronized 实现更细粒度的同步控制,这里将详细讲解java-synchronized 嵌套使用的代码实现和使用技巧。 synchronize…

    Java 2023年5月26日
    00
  • 如何自定义Java异常类?

    当Java中提供的标准异常类无法满足开发需要时,可以考虑自定义异常类。自定义异常类可以继承Java中的Exception或者RuntimeException类。自定义异常类需要定义构造方法和重写toString()方法。下面是自定义Java异常类的详细步骤: 一、继承Exception或RuntimeException类 首先需要明确自定义异常类继承哪个异常…

    Java 2023年4月27日
    00
  • Spring Security认证的完整流程记录

    Spring Security认证的完整流程记录 Spring Security是一个专门用于处理认证和授权的框架,它可以帮助我们很容易地实现常见的安全功能,例如用户认证、授权、单点登录、密码加密等。在使用Spring Security时,我们通常需要了解其认证的完整流程,以便更好地保证应用程序的安全。 下面,将通过以下步骤来描述Spring Securit…

    Java 2023年6月3日
    00
  • 详解Java代码常见优化方案

    详解Java代码常见优化方案 Java作为一门常用的编程语言,其代码的性能优化是开发过程中需要考虑的一项重要问题。本文将分析常见的Java代码优化方案,以及如何在实际项目中应用这些优化方案,提高程序的运行效率。 1. 合理使用变量 在Java中,变量使用的不合理将会带来很多性能问题。例如,如果在循环中声明一个大对象,将会带来显著的内存压力,降低程序的运行效率…

    Java 2023年5月23日
    00
  • Java实现登录和注册案例

    下面我将为您详细讲解Java实现登录和注册案例的完整攻略。我们分为以下几个步骤进行讲解: 搭建开发环境 创建用户实体类 创建用户数据访问对象(DAO) 创建用户服务(Service) 创建控制器(Controller) 配置数据库连接 创建用户表 实现注册功能 实现登录功能 接下来,我将为您详细讲解每一步的具体操作流程。 每个开发者需要有一台配有Java开发…

    Java 2023年5月19日
    00
  • Java Spring框架的注解式开发你了解吗

    Java Spring框架是一款非常流行的企业级开发框架。在该框架之中,可以采用注解式开发的方式,来提高开发效率。下面我们将详细讲解Java Spring框架的注解式开发攻略。 一、注解式开发概述Java Spring框架的注解式开发是基于Java注解的一种开发模式。它可以让Spring框架自动装配相应的Bean,从而实现工程的组装和配置。注解式开发节省了大…

    Java 2023年5月19日
    00
  • 常见的Java反射应用场景有哪些?

    常见的Java反射应用场景主要包括以下几个方面: 动态代理 取得类的方法、属性等信息 调用私有方法,破解封装性 注解解析 以下是两个具体的示例: 动态代理 动态代理是Java反射的一大应用,主要用于在运行时动态地创建一个代理类。这个代理类实现了一组给定接口,它的方法调用会被转发到一个调用处理器上。在代理对象的实现中,我们可以在方法执行前后加入任意的操作,比如…

    Java 2023年5月11日
    00
  • Spring Security 自定义授权服务器实践记录

    Spring Security 自定义授权服务器实践记录 本文将详细讲解如何使用Spring Security自定义授权服务器,并提供两个示例说明。 前置条件 在开始学习本文前,需要准备以下环境: JDK1.8或以上版本 Maven 3.0或以上版本 Spring Boot 2.0或以上版本 配置依赖 首先,需要在pom.xml中添加以下依赖: <de…

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