详解Spring中Bean的作用域与生命周期

下面是详解Spring中Bean的作用域与生命周期的完整攻略:

一、作用域

在Spring中,Bean的作用域可以理解为Bean生命周期内存在的范围。Spring提供了五种Bean作用域,分别是:Singleton、Prototype、Request、Session和GlobalSession。

1. Singleton

Singleton是Spring默认的Bean作用域。在Singleton作用域下,Spring IoC容器仅存在一个Bean实例,所有对该Bean的请求都将返回同一个Bean实例。示例代码:

@Service
@Scope("singleton")
public class SingletonService {
    // ...
}

2. Prototype

Prototype是Spring中的原型作用域,每次请求Bean时,都会创建一个新的Bean实例。示例代码:

@Service
@Scope("prototype")
public class PrototypeService {
    // ...
}

3. Request

Request作用域仅在Web应用中有效,它表示每次HTTP请求都会创建一个新的Bean实例,并且该Bean实例仅在当前HTTP请求中有效。示例代码:

@Service
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestService {
    // ...
}

4. Session

Session作用域表示每个HttpSession都有一个Bean实例,且该Bean仅在当前HttpSession中有效。示例代码:

@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionService {
    // ...
}

5. GlobalSession

GlobalSession作用域表示Bean的生命周期与PortletSession绑定,仅在Portlet环境下才有意义。示例代码:

@Service
@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class GlobalSessionService {
    // ...
}

二、生命周期

在Spring中,Bean的生命周期分为两个阶段:初始化和销毁。Spring提供了两个接口来处理Bean的生命周期,分别是InitializingBean和DisposableBean接口。

1. InitializingBean

InitializingBean接口定义了一个afterPropertiesSet()方法,当Bean的所有属性设置完毕后会自动调用该方法进行初始化。示例代码:

@Service
public class InitializingBeanImpl implements InitializingBean {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBeanImpl初始化完成,name=" + name);
    }
}

2. DisposableBean

DisposableBean接口定义了一个destroy()方法,当Bean被销毁时会自动调用该方法进行清除操作。示例代码:

@Service
public class DisposableBeanImpl implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBeanImpl已销毁");
    }
}

除了上述两个接口,Spring还提供了一种更常用的方式来处理Bean的生命周期,即利用@PostConstruct和@PreDestroy注解。

3. @PostConstruct和@PreDestroy

@PostConstruct注解用于在Bean初始化完成后自动调用方法。示例代码:

@Service
public class PostConstructService {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @PostConstruct
    public void init() {
        System.out.println("PostConstructService初始化完成,name=" + name);
    }
}

@PreDestroy注解用于在Bean销毁前自动调用方法。示例代码:

@Service
public class PreDestroyService {
    @PreDestroy
    public void destroy() {
        System.out.println("PreDestroyService已销毁");
    }
}

以上就是对Spring中Bean的作用域与生命周期的详细讲解,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring中Bean的作用域与生命周期 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java 方法引用与ambda表达式的联系

    Java 方法引用和Lambda表达式都是Java 8中引入的新特性,它们都是为了简化代码而生的,它们之间有很大的联系。在Java中,方法引用和Lambda表达式都是为了将方法作为参数传递给其他方法来完成一些功能。 Java Lambda表达式 Lambda表达式是一个匿名函数,它可以传递给其他方法作为参数。Lambda表达式通常用于函数式接口中,这些接口只…

    other 2023年6月26日
    00
  • Android webview和js互相调用实现方法

    Android WebView和JS互相调用实现方法攻略 在Android开发中,WebView是一个用于显示网页内容的控件,而JavaScript(JS)是一种用于在网页中实现交互功能的脚本语言。在WebView中,我们可以通过互相调用来实现Android和JS之间的交互。下面是实现方法的详细攻略。 1. Android调用JS方法 要在Android中调…

    other 2023年8月26日
    00
  • 解析PHP中的内存管理,PHP动态分配和释放内存

    解析PHP中的内存管理 PHP是一种脚本语言,它在运行时动态分配和释放内存。本文将详细讲解PHP中的内存管理过程,并提供两个示例说明。 内存分配 在PHP中,内存分配是自动进行的,无需手动管理。当你声明一个变量时,PHP会根据变量的类型和大小自动分配内存。例如,当你声明一个整数变量时,PHP会分配足够的内存来存储该整数。 以下是一个示例,演示了PHP中的内存…

    other 2023年8月1日
    00
  • Go语言学习技巧之命名规范

    Go语言学习技巧之命名规范攻略 在Go语言中,良好的命名规范是编写清晰、易读和易于维护代码的关键。本攻略将详细介绍Go语言中的命名规范,并提供示例说明。 1. 使用有意义的名称 命名应该具有描述性,能够清晰地表达变量、函数、类型或常量的用途。避免使用单个字母或缩写作为名称,除非它们是广为接受的约定。 示例1: // 不推荐的命名方式 func calc(a …

    other 2023年8月15日
    00
  • windows下文件同步工具 CwRsync 4.0.2 安装配置方法(图文)

    下面是详细的讲解“Windows下文件同步工具CwRsync 4.0.2安装配置方法”的攻略指南。 1. 下载安装包 首先我们需要下载CwRsync安装包,可以从官方网站(https://www.itefix.net/content/cwrsync-free-edition)的“Download”页面找到最新的版本。 2. 安装CwRsync 下载完成后,打…

    other 2023年6月25日
    00
  • Golang打包配置文件的实现示例

    下面是关于“Golang打包配置文件的实现示例”的完整攻略。 1. 简介 在Golang项目中,我们经常需要使用配置文件来配置我们的应用程序。但是,如果有很多配置文件,传递文件可能会变得很困难。因此,我们可以把配置文件打包成一个二进制文件,以便它们可以在应用程序启动时一起加载。在这篇攻略中,我们将详细讲解如何在Golang中实现打包配置文件。 2. 基本思路…

    other 2023年6月25日
    00
  • 针对iOS10新增Api的详细研究

    针对iOS10新增API的详细研究 API简介 在iOS10的开发中,苹果引入了大量的新API,以提供更好的用户体验和更强的功能支持。以下是主要的新增API列表: UserNotification框架 SiriKit框架 HomeKit框架 Speech框架 CallKit框架 Messages框架 Photos框架 下面我们详细讲解每个新增API框架的用途…

    other 2023年6月26日
    00
  • 关于vb.net:if语句单行用法

    关于VB.NET: If语句单行用法 在VB.NET中,If语句是一种常用的条件语句,它可以根据条件执行不同的代码块。除了常规的多行If语句,VB.NET还提供了单行If语句的用法,可以帮助开发人员更快地编写代码。以下是关于VB.NET: If语句单行用法的完整攻略,包括常见问题和两个示例说明。 常见问题 1. 什么是VB.NET If语句? If语句是一种…

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