Spring Bean的作用域及生命周期

目录

前言:

Bean的作用域(Scope)

单例模式

原型模式(多例作用域)

请求作用域(request)

会话作用域

全局作用域

网络长连接

Spring执行流程

Bean的生命周期

测试

小结:


前言:

    使用Spring框架时,我们需要清楚Spring托管Bean的作用域和生命周期,这样使用框架才会更加得心应手。

Bean的作用域(Scope)

单例模式

    singleton(默认模式),出于性能考虑,单例模式只需要实例一次即可(浅拷贝)。每次使用的都是同一个对象。

    该作用域的下的Bean在IoC容器中只存在一个实例。获取Bean,通过applicationContext.getBean()等方法获取,或者使用注解装配Bean(@Autowired注入)都是同一个对象实例。

    通常无状态的Bean使用该模式(无状态表示Bean对象的属性不需要更新)。Spring默认使用该模式。

原型模式(多例作用域)

    prototype(多例模式),每次使用对象都需要创建Bean对象,互相都没关系(深拷贝)。

    每次该作用域下的请求Bean对象实例都会创建新的Bean,类似于多例模式。获取Bean,通过applicationContext.getBean()等方法获取,或者使用注解装配Bean(@Autowired注入)都是新的对象实例。

    通常有状态的Bean使用该作用域,Bean的属性可能会更新。

请求作用域(request)

    每次HTTP请求,都会创建一个Bean对象(适用于 Spring MVC),类似于prototype模式。

    一次HTTP请求和响应是共享同一个Bean对象实例。

会话作用域

    每次Session会话共享一个Bean,例如记录用户的登录信息(适用于 Spring MVC)。在一个 http session 中,定义一个Bean实例。

全局作用域

    application,一个http servlet context 中共享同一个Bean(适用于 Spring MVC)。

    在一个http servlet context 中,定义一个Bean对象实例。Web应用的上下文信息,例如记录一个应用的共享信息。

网络长连接

    WebSocket,只适用于Spring WebSocket。在一个HTTP WebSocket的生命周期中(一次长连接),定义一个Bean实例。

    WebSocket的每次会话中,保存了一个Map结构的头信息,用来保存客户端消息头。第一次初始化后,直到一次长连接结束都是用一个Bean。

注意:

    可以在Spring配置文件中使用scpoe属性设置相应Bean的作用域。

Spring执行流程

    1)启动容器。加载配置文件,spring-config.xml文件。

    2)根据配置完成Bean实例化,初始化(分配内存空间,从无到有,初始化空间)。扫描配置文件下带有五大类或者方法注解,进行Bean初始化。

    3)注册Bean到Spring容器中。

    4)注入Bean的属性。(@Autowired@Resource)。

Bean的生命周期

    宏观上来谈,Bean的生命周期就是从诞生到销毁的过程。

1)开辟内存空间(实例化)

2)设置属性(注入属性)

3)初始化

  • 各种通知(对象的哪个属性初始化完成了)
  • 初始化前置方法
  • 初始化方法(两种实现方式:xml方式,注解方式)
  •  初始化后置方法

4)使用Bean

5)销毁Bean对象

注意:

    设置属性必须在初始化之前,因为有可能在初始化的时候使用Bean。

测试

package com.spring.demo.component;

import org.springframework.beans.factory.BeanNameAware;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class BeanComponent implements BeanNameAware {

    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知 -> " + s);
    }

    // xml初始化
    public void myInit() {
        System.out.println("xml方式初始化");
    }

    @PostConstruct
    public void doPostConstruct() {
        System.out.println("注解初始化");
    }

    public void hello() {
        System.out.println("hello");
    }

    @PreDestroy
    public void doPreDestroy() {
        System.out.println("执行了 doPreDestroy");
    }


}

    Spring配置文件,将Bean手动存储在Spring容器中。

<bean id="beanComponent" class="com.spring.demo.component.BeanComponent" init-method="myInit"></bean>

运行结果

注意:

    可以清楚看见Bean生命周期所做的一些事情(这里使用了两种初始化的方式)。

小结:

    Spring手动添加Bean和通过getBean()获取Bean的方式太麻烦,因此有了Spring Boot,就是Spring脚手架。目的就是更加方便的使用Spring容器,后续文章会详细介绍。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
Spring Bean 的作用域生命周期Spring 框架中非常重要的两个概念,这里简单介绍一下。 1. Bean 的作用域Spring 中,Bean 的作用域指的是 Bean 实例的创建和销毁的范围。Spring 提供了以下五种作用域: - singleton:单例模式,容器中只有一个 Bean 实例,所有对 Bean 的请求都将返回同一个实例。 - prototype:每次请求都会创建一个新的 Bean 实例。 - request:每个 HTTP 请求都会创建一个新的 Bean 实例。 - session:每个 HTTP Session 都会创建一个新的 Bean 实例。 - global session:基于 Servlet 3.0+ 的环境下,每个全局的 HTTP Session 都会创建一个新的 Bean 实例。 2. Bean 的生命周期 Bean 的生命周期指的是 Bean 实例从创建到销毁的整个过程。Spring 提供了以下七个阶段: - 实例化 Bean:Spring 根据 Bean 的定义创建一个 Bean 的实例。 - 设置 Bean 属性:Spring 将配置文件中的属性设置到 Bean 实例中。 - BeanNameAware:如果 Bean 实现了 BeanNameAware 接口,SpringBean 的 ID 传递给 setBeanName 方法。 - BeanFactoryAware:如果 Bean 实现了 BeanFactoryAware 接口,SpringBeanFactory 实例传递给 setBeanFactory 方法。 - InitializingBean:如果 Bean 实现了 InitializingBean 接口,Spring 将调用 afterPropertiesSet 方法。 - 自定义初始化方法:Bean 可以配置自定义的初始化方法。 - DisposableBean:如果 Bean 实现了 DisposableBean 接口,Spring 将调用 destroy 方法。 - 自定义销毁方法:Bean 可以配置自定义的销毁方法。 以上就是 Spring Bean 的作用域生命周期的简单介绍。理解 Bean 的作用域生命周期对于正确使用 Spring 框架非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小太空人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值