Spring Bean作用域与生命周期深入讲解

Spring Bean作用域与生命周期深入讲解

在Spring框架中,可以通过配置Bean的作用域和生命周期来管理Bean对象的创建、销毁以及访问范围等问题。本文将详细讲解Spring Bean的作用域和生命周期相关的知识。

Bean的作用域

Bean的作用域指的是Bean对象在IoC容器中的存活周期和访问范围,Spring框架提供了5种作用域类型,分别是:

  • 单例(Singleton):在整个容器中只有一个实例,IoC容器初始化时创建并缓存Bean对象,以后每次请求都返回同一个Bean对象。
  • 原型(Prototype):每次请求都会创建一个新实例,IoC容器不会缓存或复用Bean对象,每次请求都会重新创建一个新的Bean对象。
  • 会话(Session):在Web应用中,为每个会话创建一个Bean对象,一般用于存储用户相关数据。
  • 请求(Request):在Web应用中,为每个请求创建一个Bean对象,一般用于存储请求相关数据。
  • 全局会话(Global Session):在Portlet应用中,为每个全局会话创建一个Bean对象,一般用于存储应用相关的全局数据。

示例1:使用prototype作用域创建bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype"/>

</beans>

当我们在应用程序中第一次调用"myPrototypeBean"时,Spring IoC容器会创建一个新的MyPrototypeBean实例对象,并将其注入到容器中。如果下次再调用该Bean时,Spring IoC容器会再次创建一个新的MyPrototypeBean实例对象。

使用Prototype作用域可以控制每次请求或使用时,都产生一个新的Bean实例,避免出现污染数据或数据不一致的情况。

Bean的生命周期

对于一个Bean,从创建到销毁都有一个完整的生命周期,Spring框架提供了完整的Bean生命周期管理机制,用户可以在Bean创建、初始化和销毁时做出一些处理。

通常情况下,Spring容器通过Java反射机制调用Bean的构造方法创建Bean实例,然后对Bean进行初始化(填充属性、调用初始化方法等),最后将Bean存储到IoC容器中。而在Bean从容器中移除前,Spring容器会执行一些销毁工作(调用销毁方法等),最后销毁Bean实例。

Spring框架定义了多个回调接口,可以让用户在Bean初始化和销毁的不同阶段做出一些处理,这些回调接口包括:

  • BeanNameAware
  • BeanFactoryAware
  • ApplicationContextAware
  • InitializingBean
  • DisposableBean

此外,用户还可以定义自己的初始化方法和销毁方法,具体定义方式如下:

示例2:定义自己的初始化方法和销毁方法

public class MyBean {

    private String name;
    ...

    public void init() {
        System.out.println("Bean正在进行初始化操作");
        ...
    }

    public void destroy() {
        System.out.println("Bean正在进行销毁操作");
        ...
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="destroy"/>

</beans>

在上述示例中,我们定义了一个init方法和一个destroy方法,然后通过配置文件将这两个方法指定为Bean的初始化方法和销毁方法。在Bean初始化时,Spring容器会自动调用init方法;在Bean销毁前,Spring容器会自动调用destroy方法。

总结:

以上是Spring Bean作用域与生命周期的深入讲解,Spring框架提供了完整的Bean生命周期管理机制,用户可以根据自己的需要指定Bean的作用域和定义Bean的初始化方法和销毁方法,以此来管理Bean对象的创建、销毁以及访问范围等问题。

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

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

相关文章

  • SpringBoot 自定义注解实现涉密字段脱敏

    下面是详细的攻略: 简介 在实际项目中,很多时候需要对涉密字段进行脱敏,以保护用户隐私,比如手机号、身份证号、银行卡号等。本文将介绍如何使用 SpringBoot 自定义注解来实现涉密字段的脱敏功能。 步骤 定义注解 首先需要定义一个注解,用于标识需要脱敏的字段。可以自定义一个 @SensitiveInfo 注解,该注解可以用在类、字段、方法等地方。注解可以…

    Java 2023年6月3日
    00
  • Spring Boot在Web应用中基于JdbcRealm安全验证过程

    关于Spring Boot在Web应用中基于JdbcRealm安全验证的完整攻略,可以分为以下几个部分: 依赖配置 在项目的pom.xml文件中添加Shiro和JDBC驱动的依赖: <dependencies> <dependency> <groupId>org.apache.shiro</groupId> &…

    Java 2023年5月19日
    00
  • mybatis中resulthandler的用法

    Mybatis是一款优秀的ORM框架,它能够帮助程序员快速、简单地完成Java对象与关系数据库的互相映射。它提供了各种查询方式,其中一种比较有特色的查询方式就是使用ResultHandler进行分页查询,那么下面将详细介绍Mybatis中Resulthandler的用法。 1. Resulthandler简介 Mybatis中的Resulthandler相当…

    Java 2023年5月20日
    00
  • 图书管理系统java代码实现

    我们来详细讲解一下“图书管理系统Java代码实现”的完整攻略。 1. 确定项目需求并设计数据库 在开发一个图书管理系统前,我们需要先确定其需求。例如,一个简单的图书管理系统通常需要包含以下基本功能: 图书的添加,修改和删除操作 图书的查找和查询操作 图书的借阅和归还操作 一旦需求确定,我们就可以开始设计数据库表结构了。一个基本的图书管理系统需要包含图书表、读…

    Java 2023年5月19日
    00
  • Javassist如何操作Java 字节码

    Javassist是一个强大的Java字节码编辑器,通过它可以操作Java字节码。下面我们将介绍如何使用Javassist操作Java字节码。 1. Javassist基础 1.1 添加Javassist依赖 首先需要在项目中添加Javassist依赖,这里以Maven项目为例,在pom.xml文件中添加以下依赖信息: <dependency> …

    Java 2023年5月26日
    00
  • Spring Security 密码验证动态加盐的验证处理方法

    针对“Spring Security 密码验证动态加盐的验证处理方法”的完整攻略,我将分为以下几个部分进行讲解: 加盐的原理及作用 Spring Security 密码验证流程 实现动态加盐的验证处理方法 示例代码和测试 1. 加盐的原理及作用 在密码存储中,加盐是一种常用的安全策略,其原理是在密码明文前后添加一段随机的字符串(即盐),然后对整个字符串进行哈…

    Java 2023年5月20日
    00
  • Disruptor-源码解读

    前言 Disruptor的高性能,是多种技术结合以及本身架构的结果。本文主要讲源码,涉及到的相关知识点需要读者自行去了解,以下列出: 锁和CAS 伪共享和缓存行 volatile和内存屏障 原理 此节结合demo来看更容易理解:传送门 下图来自官方文档 官方原图有点乱,我翻译一下 在讲原理前,先了解 Disruptor 定义的术语 Event 存放数据的单位…

    Java 2023年4月17日
    00
  • 让javascript加载速度倍增的方法(解决JS加载速度慢的问题)

    下面是一份详细讲解“让 JavaScript 加载速度倍增的方法”的攻略,希望能够帮助到你。 为什么要关注 JavaScript 的加载速度 JavaScript 是网页的重要组成部分之一,但是在加载过程中可能会带来用户体验的负面影响。如果加载速度过慢,会导致页面变得卡顿,用户体验不佳,同时也会对网站的排名和转化率造成不良影响。因此,关注 JavaScrip…

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