浅谈Spring中Bean的作用域、生命周期

yizhihongxing

以下是关于Spring中Bean的作用域和生命周期的详细讲解,包括定义、配置、作用域和生命周期四个方面。

定义

在Spring中,Bean就是被Spring容器所管理的Java对象。我们可以将Java对象配置为一个Bean,并通过Spring容器去创建、管理、装配、销毁这个Bean。

配置

Bean的配置分为两种方式:XML和注解。

XML配置

在XML文件中定义元素来配置Bean。以下是一个基本的XML配置:

<bean id="myBean" class="com.example.MyBean"/>

其中,id为Bean的唯一标识符,class指定了Bean的实现类。

注解配置

在Java代码中使用注解的方式来定义Bean。以下是一个基本的注解配置:

@Component
public class MyBean {
    // Bean的实现代码
}

其中,@Component是Spring提供的常用注解,用于将一个类声明为Bean。还有其他注解如@Service@Repository@Controller等。

作用域

Bean的作用域指定了Bean实例的创建和销毁方式。Spring提供了五种作用域:singleton、prototype、request、session、global session。

Singleton

Singleton是默认的作用域,它表示一个Bean在Spring容器中仅被创建一次,并且所有请求都返回同一个实例。在XML配置中,可以使用scope属性来指定该Bean的作用域,如下:

<bean id="myBean" class="com.example.MyBean" scope="singleton"/>

Prototype

Prototype表示每个请求都创建一个新的Bean实例。在XML配置中,使用scope属性设置为prototype即可:

<bean id="myBean" class="com.example.MyBean" scope="prototype"/>

Request

Request作用域表示一个Bean实例仅在每个HTTP请求中存在。在Web应用中,可以使用scope属性设置为request

<bean id="myBean" class="com.example.MyBean" scope="request"/>

Session

Session作用域表示一个Bean实例仅在每个HTTP会话中存在。在Web应用中,可以使用scope属性设置为session

<bean id="myBean" class="com.example.MyBean" scope="session"/>

Global Session

Global Session作用域类似于Session作用域,但它是在Portlet环境下使用。在Web应用中,可以使用scope属性设置为globalSession

<bean id="myBean" class="com.example.MyBean" scope="globalSession"/>

生命周期

Bean的生命周期可以理解为Bean从被创建到被销毁的整个过程。Spring为Bean提供了生命周期方法,开发者可以在Bean的生命周期方法中完成一些自定义的初始化或销毁操作。

初始化方法

在Bean实例被创建后,容器会调用Bean的初始化方法。Spring提供了两种方式来定义初始化方法:

  1. 使用@PostConstruct注解

    ```java
    @Component
    public class MyBean {

    @PostConstruct
    public void init() {
        // 初始化代码
    }
    

    }
    ```

  2. 在XML配置中指定init-method

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

销毁方法

在Bean实例被销毁前,容器会调用Bean的销毁方法。Spring提供了两种方式来定义销毁方法:

  1. 使用@PreDestroy注解

    ```java
    @Component
    public class MyBean {

    @PreDestroy
    public void destroy() {
        // 销毁代码
    }
    

    }
    ```

  2. 在XML配置中指定destroy-method

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

示例

接下来,我们将通过两个示例来演示作用域和生命周期的使用。

例1:@Scope示例

我们创建一个ScopeBean类,定义一个名为message的成员变量和一个setter和getter方法,并在控制台中分别输出setter和getter方法。然后使用xml和@Scope注解分别配置scope作用域和prototype作用域,输出传入的message和调用的getter方法。

@Component
public class ScopeBean {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
<bean id="singletonScopeBean" class="com.example.ScopeBean">
    <property name="message" value="Hello Singleton Scope!" />
</bean>
<bean id="prototypeScopeBean" class="com.example.ScopeBean" scope="prototype">
    <property name="message" value="Hello Prototype Scope!" />
</bean>
@Component
@Scope("prototype")
public class ScopeBean {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

测试类的代码如下:

public class ScopeTest {

    @Autowired
    @Qualifier("singletonScopeBean")
    private ScopeBean singletonBean;

    @Autowired
    @Qualifier("prototypeScopeBean")
    private ScopeBean prototypeBean;

    @Test
    public void testScope() {
        System.out.println(singletonBean.getMessage());
        System.out.println(singletonBean.getMessage());

        System.out.println(prototypeBean.getMessage());
        System.out.println(prototypeBean.getMessage());
    }
}

输出结果如下。可以看到,Singleton作用域的Bean实例仅创建了一次,而Prototye作用域的Bean实例在每次请求时都会重新创建。

Hello Singleton Scope!
Hello Singleton Scope!
Hello Prototype Scope!
Hello Prototype Scope!

例2:@PostConstruct和@PreDestroy示例

我们创建一个LifeCycleBean类,使用@PostConstruct注解定义初始化方法,在其中输出"Init method called"。使用@PreDestroy注解定义销毁方法,在其中输出"Destroy method called"。

@Component
public class LifeCycleBean {

    @PostConstruct
    public void init() {
        System.out.println("Init method called");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("Destroy method called");
    }
}

测试类的代码如下:

public class LifeCycleTest {

    @Test
    public void testLifeCycle() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.registerShutdownHook();
    }
}

这里我们创建了一个AnnotationConfigApplicationContext对象,并通过registerShutdownHook()方法注册了一个JVM关闭的钩子函数,以便在JVM关闭时执行销毁方法。

运行测试类输出结果如下。我们可以看到,在Bean被创建时,初始化方法被调用;在JVM关闭时,销毁方法被调用。

Init method called
Destroy method called

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

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

相关文章

  • Linux CentOS使用crontab设置定时重启的方法

    下面是详细讲解“Linux CentOS使用crontab设置定时重启的方法”的完整攻略。 1. 什么是crontab crontab是一种linux系统下的定时任务管理器,可以让用户在指定时间自动执行脚本或命令。crontab会定期执行用户指定的shell命令或脚本。 2. 在CentOS中设置定时重启的步骤 以下是在CentOS中使用crontab设置定…

    other 2023年6月27日
    00
  • Element的穿梭框数据量大时点击全选卡顿的解决方案

    下面是详细的攻略: 问题背景 Element UI是一款非常优秀的Vue.js组件库,其中提供了穿梭框(shuttle)组件,是一个方便用户进行多选操作的组件。但是,在数据量较大的情况下,在穿梭框中勾选全选时,会导致卡顿的现象,影响用户体验。 原因分析 穿梭框勾选全选的时候,会遍历全部的数据,进行勾选操作,当数据量较大时,操作次数过多,导致卡顿现象。 解决方…

    other 2023年6月26日
    00
  • cygwin 在windows下使用linux命令的方法

    Cygwin 在 Windows 下使用 Linux 命令的方法 Cygwin 是一个为 Windows 系统开发的类 Unix 系统。它提供了很多 Unix/Linux 系统下常用的命令和工具,让 Windows 用户能够使用与 Linux 相似的工具来进行开发。下面是使用 Cygwin 在 Windows 下使用 Linux 命令的方法: 1. 安装 C…

    other 2023年6月26日
    00
  • mysql设置密码的三种方法

    以下是详细讲解“MySQL设置密码的三种方法的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: MySQL设置密码的三种方法 MySQL是一种流行的关系型数据库管理系统,可以使用密码来保护数据库安全性。本攻略将介绍MySQL设置密码的三种方法。 方法一:使用mysqladmin命令 可以使用mysqladmin命令来设置MySQL的密码…

    other 2023年5月10日
    00
  • springboot + vue 实现递归生成多级菜单(实例代码)

    下面我将为您详细讲解“springboot + vue 实现递归生成多级菜单”的完整攻略。 简介 本文将介绍如何使用SpringBoot和Vue.js实现递归生成多级菜单。通过该方案,可以生成任意深度的多级菜单。 准备工作 在开始之前,需要下载安装以下软件: JDK 8+ Node.js Vue CLI 创建SpringBoot项目 首先,使用Spring …

    other 2023年6月27日
    00
  • vue之二级路由

    当然,我很乐意为您提供有关“Vue之二级路由”的完整攻略。以下是详细的步骤和两个示例: 1 二级路由 在Vue中,可以使用Vue Router来实现路由功能。二级路由是指在一个路由下再嵌套一个路由,也就是说,一个路由可以有多个子路由。 2 示例 以下是两个二级路由的示例: 2.1 创建二级路由 要创建二级路由,可以使用以下步骤: 在Vue Router中定义…

    other 2023年5月6日
    00
  • python3爬虫_环境安装

    Python3爬虫是一种获取互联网数据的技术,它可以自动化地从网站上获取数据并进行处理。在进行Python3爬虫之前,需要安装相应的环境。本文将介绍Python3爬虫环境的安装方法和示例。 1. Python3爬虫环境的安装方法 Python3爬虫环境的安装方法如下: 安装Python3:从Python官网(https://www.python.org/do…

    other 2023年5月5日
    00
  • vncserver启动不了

    当然,我可以为您提供有关“vncserver启动不了”的完整攻略,以下是详细说明: 什么是VNC? VNC(Virtual Network Computing)是一种远程桌面协议,允许用户通过网络远程控制另一台计算机。VNC协议由客户端和服务器组成,客户端通过VNC协议连接到服务器,然后可以在客户端上远程控制服务器。 vncserver启动不了的原因 vnc…

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