Bean 作用域和生命周期

news2025/7/23 15:24:16

一 : Bean的默认作用域

Bean 默认情况下是单例状态(singleton),所有人使用的都是同一个对象.

举例理解Bean的单例状态 :

假设现在有一个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的途中 A 用户却“悄悄”地修
改了公共 Bean 的数据,导致 B 用户在使用时发生了预期之外的逻辑错误 .

假设现在有一个IkunBean , 张三和李四和都要使用这个IkunBean .

Ikun.java

package  Ikun;

public class Ikun {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Chicken{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}


IkunBean

package com;

import Ikun.Ikun;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class IkunBean {

    @Bean
    public Ikun chicken() {
        Ikun ikun = new Ikun();
        ikun.setAge(26);
        ikun.setName("鲲鲲");
        return ikun;
    }
}


Controller1.java

package com;

import Ikun.Ikun;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * 张三取出Bean对象
 */

@Controller
public class Controller1 {

    @Autowired
    private Ikun ikun;

    public void docontroller1() {
        System.out.println("张三取出该对象");
        System.out.println("原数据:"+ ikun);

        Ikun ikun1 = ikun;
        ikun1.setName("只因");
        System.out.println("现数据:"+ ikun1);
    }
}


Controller2.java

package com;

import Ikun.Ikun;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * 李四取出Bean对象
 */

@Controller
public class Controller2 {

    @Autowired
    private Ikun ikun;

    public void doController2() {
        System.out.println("李四取出该对象");
        System.out.println(ikun);
    }
}

在这里插入图片描述

分析 :

在这里插入图片描述

总结 :

Bean作用域定义 : Bean对象在整个Spring中的某种行为模式 . 比如单例作用域表示的是Bean对象在Spring(框架)中只有一份 .

二 : 作用域定义

  1. 变量的作用域 : 限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域.
  2. Bean的作用域: 指 Bean 在 Spring 整个框架中的某种行为模式,比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,当其他人修改了这个值之后,另一个人读取到的就是被修改的值 .

三 : Bean的六种作用域及其说明

在这里插入图片描述

3.1 singleton

  • 官方说明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container .
  • 描述:该作用域下的Bean在IoC容器中只存在一个实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象 .
  • 场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新 .
  • 备注:Spring默认选择该作用域 .

3.2 prototype

  • 官方说明:Scopes a single bean definition to any number of object instances .
  • 描述:每次对该作用域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是新的对象实例 .
  • 场景:通常有状态的Bean使用该作用域 , 有状态表示Bean对象的属性状态需要频繁更新 .

3.3 request

  • 官方说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:每次http请求会创建新的Bean实例,类似于prototype
  • 场景:一次http的请求和响应的共享Bean
  • 备注:限定SpringMVC中使用

3.4 Session

  • 官方 说明:Scopes a single bean definition to the lifecycle of an HTTP Session.Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一个http session中,定义一个Bean实例
  • 场景 : 用户回话的共享Bean, 如:记录某个用户的登陆信息
  • 备注:限定SpringMVC中使用

3.5 application

官方说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.

  • 描述:在一个http servlet Context中,定义一个Bean实例
  • 场景:Web应用的上下文信息, 如:记录一个应用的共享信息
  • 备注:限定SpringMVC中使用

3.6 websocket

  • 官方说明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一个HTTP WebSocket的生命周期中,定义一个Bean实例
  • 场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一次初始化后,直到WebSocket结束都是同一个Bean。
  • 备注:限定Spring WebSocket中使用 . [注意 : Spring MVC 模式下也可以使用websocket]
  • 参考文章 : java WebSocket开发入门WebSocket

仍然是前面的例子 , 此处我们将Bean的作用域设置为多例模式 , 查看运行效果 . 设置多例模式的方法有以下两种 :

在这里插入图片描述
运行结果 :

在这里插入图片描述

四 : Spring执行流程

在这里插入图片描述

五 : Bean的生命周期

在这里插入图片描述

BeanComponent.java

package com.component;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

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

/**
 * 演示Bean的生命周期
 */

@Component
public class BeanComponent implements BeanNameAware {

    //依赖注入
    @Autowired
    private UserComponent userComponent;

    public BeanComponent(UserComponent userComponent) {
        this.userComponent = userComponent;
        userComponent.doComponent();
        System.out.println("执行BeanComponent的构造方法!");
    }
    
    //继承 BeanNameAware接口,执行通知方法
    public void setBeanName(String s) {
        System.out.println("执行了setBeanName通知 : " + s);
    }
    
    //xml中init-method指定的方法
    public void initMethod() {
        System.out.println("执行了initMethod方法!");
    }

    
    @PostConstruct
    public void myPostConstruct() {
        System.out.println("执行了PostConstruct方法!");
    }


    //销毁前执行方法
    @PreDestroy
    public void myPreDestroy() {
        System.out.println("执行了PreDestroy方法!");
    }


    //使用Bean
    public void use() {
        System.out.println("执行了use方法!");
    }
}

Test5.java

import com.component.BeanComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Bean的生命周期
 */
public class Test5 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanComponent component = (BeanComponent) context.getBean("beanComponent");
        component.use();
        context.destroy();
    }
}

spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com"></content:component-scan>
    <bean id="beanComponent" class="com.component.BeanComponent"
          init-method="initMethod"></bean>
</beans>



解释 :

在这里插入图片描述

在这里插入图片描述

Bean的生命周期类似于买房的过程 :

  1. 先买房(实例化 , 从无到有) ;
  2. 装修(设置属性) ;
  3. 买家电 (各种初始化) ;
  4. 入住(使用Bean) ;
  5. 卖出去(Bean销毁) .

Q : 为什么要先设置属性(依赖注入)再初始化呢 ?

A : 防止初始化时要用到依赖注入的对象 .

重点 : 掌握Bean的大的执行流程 .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]SSM计算机毕业设计中医药系统论文2022JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

快速清除PPT缓存文件或C盘隐藏大文件

是否遇到过电脑的磁盘空间越来越满&#xff0c; 请注意这些临时文件可谓是C盘的存储杀手&#xff0c;无形中吞噬掉很多磁盘空间&#xff0c;这里以PPT为例&#xff1a; C:\Users\Admin\AppData\Roaming\Microsoft\PowerPoint\ 1.首先在PPT2019软件中&#xff0c;打开一个PPT文…

实现BIO多客户端通讯模式

实现BIO多客户端通讯模式背景思想实现服务端线程类服务端客户端结果背景 如果服务端需要处理很多个客户端的消息通信请求应该如何处理呢&#xff0c;此时我们就需要在服务端引入线程了&#xff0c;也就是说客户端每发起一个请求&#xff0c;服务端就创建一个新的线程来处理这个…

PyTorch搭建基于图神经网络(GCN)的天气推荐系统(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言~~~ 一、背景 极端天气情况一直困扰着人们的工作和生活。部分企业或者工种对极端天气的要求不同&#xff0c;但是目前主流的天气推荐系统是直接将天气信息推送给全部用户。这意味着重要的天气信息在用户手上得不到筛选&#xff0c;…

(C语言)背答案

[#4练习赛]背答案 题目描述 传智专修学院“Java程序设计”的期末考试来源于一个选择库&#xff0c;共有 nnn 道题目&#xff0c;每道题目由问题和答案组成&#xff0c;都是一个字符串&#xff0c;保证所有题目题面互不相同。这个题库已经发给同学进行备考准备。 正式考试中&…

Labview+STM32无线温湿度采集

一.介绍 该项目采用正点原子的STM32ZET6精英板DHT11温湿度模块泽耀科技的无线串口作为下位机&#xff0c;Labview无线串口作为上位机读取下位机发来的数据并处理。 泽耀科技的产品是我在开发过程中经常用到的&#xff0c;他们不仅产品做的非常不错&#xff0c;而且资料齐全售后…

远离cmd,拥抱powershell

简介&#xff1a;cmd命令提示符是在操作系统中&#xff0c;提示进行命令输入的一种工作提示符。在不同的操作系统环境下&#xff0c;命令提示符各不相同。 在windows环境下&#xff0c;命令行程序为cmd.exe&#xff0c;是一个32位的命令行程序&#xff0c;微软Windows系统基于W…

动态规划--区间dp

区间dp题目列表&#xff1a;(1)石子合并(2)环形石子合并(3)能量项链(4)加分二叉树(5)凸多边形的划分(6)棋盘分割题目列表&#xff1a; (1)石子合并 在复习石子合并之前&#xff0c;为了直接进入专题“区间dp“&#xff0c;做一个区间dp的基础题&#xff0c;这个题目具有代表性…

1.2 Android 5.0 的特点

和其他版本相比&#xff0c; Android 5.0 的突出特性如下所示。 &#xff08;1&#xff09;全新的 Material 界面设计 Android 5.0 Lollipop 界面设计的灵感来源于自然、 物理学 以及基于打印效果的粗体、图标化的设计&#xff0c;换句话说&#xff0c;它的设 计是一种基于高品…

智慧建筑BIM解决方案-最新全套文件

智慧建筑BIM解决方案-最新全套文件一、建设背景为什么要发展智慧建筑二、思路架构三、建设方案智慧建筑建设时应考虑下面3个方面&#xff1a;1、减少耗能&#xff0c;促进资源利用效率2、优化工作和生活环境3、确保运营安全可靠四、获取 - 智慧建筑BIM全套最新解决方案合集一、…

m超外差单边带接收机的simulink仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 超外差是利用本地产生的振荡波与输入信号混频&#xff0c;将输入信号频率变换为某个预先确定的频率的方法。这种方法是为了适应远程通信对高频率、弱信号接收的需要&#xff0c;在外差原…

基于springboot在线玩具商城交易平台的设计与实现

随着科技创新不断突破玩具界限&#xff0c;特别是随着智能时代到来&#xff0c;电子游戏的兴起对传统玩具行业带来了冲击&#xff0c;智能玩具应运而生&#xff0c;成为新产品方向。智能玩具受消费者青睐&#xff0c; 随着电子商务的发展&#xff0c;其在我国的经济地位越来越…

spring boot酒店会员点餐系统毕业设计源码072005

Springboot酒店会员点餐系统 摘 要 进入21世纪以来&#xff0c;计算机有了迅速的发展。计算机应用、信息技术全面渗透到了人类社会的各个方面&#xff0c;信息化已成为世界经济和社会发展的大趋势。―企业的管理也从人工操作变得更加自动化、智能化和高效化。如果复杂的工作光靠…

PMP大家都是怎么备考的?使用什么工具可以分享一下吗?

这里分享PMP理论中的4个工具&#xff0c;在人生管理和项目管理中是通用的。所有的工具&#xff0c;只有在对的时间&#xff0c;用在对的地方&#xff0c;才能真正指导实践。 项目经理应符合PMI人才三角。分别为&#xff1a;技术项目管理&#xff1b;领导力&#xff1b;战略和…

腾讯云服务器后台重装后需要配置的一些东西

1、adduser 用户名&#xff08;创建普通用户&#xff09; 2、passwd 用户名&#xff08;给普通用户设置密码&#xff09; 3、userdel -r 用户名&#xff08;删除普通用户&#xff09; 4、修改/etc/sudoers文件&#xff08;给普通用户可以提权的机会&#xff09; 5、sudo yum in…

Hive——Hive常用内置函数总结

✅作者简介&#xff1a;最近接触到大数据方向的程序员&#xff0c;刚入行的小白一枚 &#x1f34a;作者博客主页&#xff1a;皮皮皮皮皮皮皮卡乒的博客 &#x1f34b;当前专栏&#xff1a;Hive学习进阶之旅 &#x1f352;研究方向&#xff1a;大数据方向&#xff0c;数据汇聚&a…

vdsm:添加接口调试demo

目录 添加API接口 2.添加api方法 3.Vdsm-api.yml添加参数 暴露jsonrpc接口&#xff1a; 需要重启vdsmd vdsm-client 调试 本文通过添加一个配置ovs全局参数的接口 添加API接口 文件路径&#xff1a;API.py 2.添加api方法 文件路径&#xff1a;network/api.py 3.Vdsm-ap…

4.2——Node.js的npm和包

目录初识node.jsnode.js的安装和查看版本使用node命令对js文件运行窗口的快捷键fs 文件系统模块fs.readFile() 方法写入文件fs.writeFile()案例——考试成绩整理路径问题path 路径模块路径拼接path.join()获取路径中的文件名path.basename()获取路径中的文件扩展名path.extname…

用Python的Django框架来制作一个RSS阅读器

Django带来了一个高级的聚合生成框架&#xff0c;它使得创建RSS和Atom feeds变得非常容易。 什么是RSS&#xff1f; 什么是Atom&#xff1f; RSS和Atom都是基于XML的格式&#xff0c;你可以用它来提供有关你站点内容的自动更新的feed。 了解更多关于RSS的可以访问 http://www…

[附源码]SSM计算机毕业设计足球队管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…