详解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日

相关文章

  • win10激活工具——hwidgen的使用方法

    win10激活工具——hwidgen的使用方法 如果你是Windows 10系统的使用者,想要激活系统却不想使用破解软件,那么hwidgen是一款非常不错的激活工具。下面我们将介绍hwidgen的使用方法。 什么是hwidgen hwidgen是由国外工具大神s1ave77开发的一款Windows10数字激活工具,与大多数的激活工具不同,hwidgen激活的…

    其他 2023年3月28日
    00
  • Windows10环境安装sdk8的图文教程

    下面是详细的Windows10环境安装sdk8的图文教程: 准备工作 在进行安装之前,需要先进行一些准备工作: 确保电脑已经安装了JDK,并且环境变量配置正确。 下载适用于Windows的jdk-8uXXX-windows-x64.exe安装文件,XXX表示版本号。 安装过程 双击jdk-8uXXX-windows-x64.exe安装文件,弹出安装向导,点击…

    other 2023年6月27日
    00
  • Java使用线程同步解决线程安全问题详解

    Java使用线程同步解决线程安全问题详解 概述 Java中多线程带来的好处是同时可以执行多个任务,但是线程之间共享同一个全局变量或对象可能会出现线程安全问题。线程安全问题的解决最主要的方法是使用锁机制,也就是线程同步来保证同一时刻只有一个线程能够访问共享变量或对象。 线程同步可以通过synchronized关键字来实现,synchronized关键字可以保证…

    other 2023年6月27日
    00
  • Android自定义控件ViewGroup实现标签云(四)

    下面是对《Android自定义控件ViewGroup实现标签云(四)》的详细讲解: 1. 概述 该教程是由某作者编写的系列教程之一,介绍了如何通过继承ViewGroup来实现一个标签云。主要有以下几个部分: 定义标签控件(TagView),继承自TextView,并设置相关属性,如颜色、圆角、间距等; 定义标签云布局控件(TagCloudView),继承自V…

    other 2023年6月25日
    00
  • 深入理解Vue生命周期、手动挂载及挂载子组件

    深入理解Vue生命周期 Vue生命周期是Vue组件从创建到销毁直接的各个阶段,每个阶段都拥有自己的方法和属性。理解Vue生命周期非常重要,可以方便我们在合适的阶段做出更好的操作。 Vue生命周期分为8个阶段: beforeCreate:实例刚刚被创建,数据观测(data observer)和事件机制(event mechanism)未初始化。所以组件内一般无…

    other 2023年6月27日
    00
  • C语言数组超详细讲解下篇扫雷

    C语言数组超详细讲解下篇扫雷 一、背景 扫雷作为一个经典的小游戏,其实是使用C语言数组实现的。在本文中,我们将深入探讨如何使用数组来实现扫雷游戏。 二、数组的定义与初始化 在C语言中,数组是一种数据结构,可以容纳一定数量的相同类型的数据。 首先,我们需要定义和初始化一个二维数组来存储扫雷棋盘的信息,例如: #define ROWS 10 #define CO…

    other 2023年6月26日
    00
  • Go语言字符串常见操作的使用汇总

    Go语言字符串常见操作的使用汇总 字符串基础 字符串是由一系列字符组成的,一般用来表示文本的信息。 在Go语言中,字符串属于基础数据类型,使用双引号”或反引号`来定义。其基础定义如下: // 使用双引号定义 str1 := "Hello, world!" // 使用反引号定义 str2 := `Hello, world!` 字符串常见操作…

    other 2023年6月20日
    00
  • PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)

    当使用PHP开发Web应用程序时,我们经常需要判断用户是否已经登录,并根据登录状态执行不同的操作或者跳转到不同的页面。下面是一个完整的攻略,包含了两个示例说明。 步骤1:设置登录状态 首先,我们需要在用户登录成功后设置一个登录状态。这可以通过在用户登录时将登录状态存储在会话(session)中来实现。会话是一种在服务器上存储用户数据的机制,可以跨多个页面和请…

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