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

yizhihongxing

下面是详细讲解“一文搞懂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统计字符串中指定元素出现次数方法

    Java统计字符串中指定元素出现次数方法攻略 在Java中统计字符串中指定元素出现次数,我们通常有以下几种方法: 1. 使用正则表达式 我们可以使用正则表达式来匹配指定元素出现的次数。下面是一个示例代码: public static int countOccurrencesUsingRegex(String str, String element) { St…

    Java 2023年5月27日
    00
  • 小程序实现横向滑动日历效果

    如下是小程序实现横向滑动日历效果的完整攻略: 步骤一:页面布局 页面布局一般使用scroll-view实现横向滑动效果。具体地,在scroll-view中添加一个日历视图即可。通常我们使用一个表格来实现日历视图,表格中的每个格子代表一个日期。代码示例如下: <scroll-view scroll-x="true" class=&qu…

    Java 2023年5月23日
    00
  • XML经典问答

    XML经典问答攻略 本文将为您提供针对XML经典问题的攻略,以解决常见的XML相关问题。以下是您需要注意的几个方面: 1. XML文档结构 XML文件通常由一个根元素(root element)组成,并由开始标签和结束标签加以表示。中间可以嵌套若干子元素。元素可以包含属性(attribute)或文本(text)。如下所示: <?xml version=…

    Java 2023年5月20日
    00
  • Java异常处理的机制是什么?

    Java异常处理机制是一种处理程序错误的方式。在Java程序运行时,如果程序出现错误(如除0、数组下标越界等),程序会抛出一个异常对象。此时,Java会尝试查找能够处理该异常的异常处理程序,若找到则执行该处理程序,若没有找到则程序终止并输出堆栈跟踪信息。 Java异常处理机制主要分为异常抛出、异常捕获和异常处理三个部分。 1.异常抛出 在Java中,异常是以…

    Java 2023年4月27日
    00
  • 微信小程序实现列表页的点赞和取消点赞功能

    下面是实现微信小程序列表页点赞和取消点赞的攻略。该攻略将分为以下几个步骤: 前置准备 列表页数据的绑定和渲染 点赞和取消点赞功能的实现 点赞和取消点赞功能的联动 示例说明 前置准备 在开始实现之前,你需要先了解微信小程序的基本知识,并且在微信开发者工具中创建一个小程序项目。你还需要准备一个与列表页数据相关的接口,用于获取列表页数据、点赞和取消点赞等操作。 列…

    Java 2023年5月30日
    00
  • Java结合JS实现URL编码与解码

    URL编码 & 解码的概念 URL编码:将URL中特殊字符转义成十六进制字节,以便浏览器和服务器可以更好地理解和传递这些字节。 URL解码:将URL中的十六进制字节转换为特殊字符。 需要注意的是:URL编码与解码操作是成对出现的, 编码后的URL需要解码才能得到正确的值。 Java实现URL编码 & 解码 Java中URL编码的实现主要依赖于…

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ActionTokenException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“MappingNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会现此错误。在这种情况下检查文件以解决此问题。 URL错误:如果URL不正确,则可能会出现此错误。在这种情况下,需要检查URL以解决此问题。 以下是两个实例: 例 1 如果配置文件…

    Java 2023年5月5日
    00
  • J2SE中的序列化之继承

    J2SE中的序列化是将对象转换成字节流,用于对象的存储和传输。而在序列化对象时,如果该对象实现了Serializable接口,那么子类也会自动实现序列化,这就是所谓的“继承序列化”。 下面通过示例说明继承序列化的几个要点: 1.子类序列化时父类属性的序列化与反序列化: public class Parent implements Serializable{ …

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