当前位置:

首页 > 编程开发 > Java Spring中Bean的作用域和生命周期分析

Java Spring中Bean的作用域和生命周期分析

Bean作用域和生命周期Bean作用域Bean的作用域是指Bean在Spring整个框架中的某种行为模式.比如singleton单例作用域,就表示Bean在整个Spring中只有一份,它是全局共享的,那么当其他人修改了这个值之后,那么另一个人读取到的就是被修改的值.Bean作用域分类singleton:单例作用域(默认作用域)prototype:原型作用域(多例作用域)request:请求作用域session:回话作用域application:全局作用域websocket:HTTP#注意#后4种状态是Sp

本文目录

    Bean 作用域和生命周期

    Bean 作用域

    Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式.

    比如 singleton 单例作用域, 就表示 Bean 在整个 Spring 中只有一份, 它是全局共享的, 那么当其他人修改了这个值之后, 那么另一个人读取到的就是被修改的值.

    Bean 作用域分类

    • singleton: 单例作用域 (默认作用域)

    • prototype: 原型作用域 (多例作用域)

    • request: 请求作用域

    • session: 回话作用域

    • application: 全局作用域

    • websocket: HTTP

    # 注意 # 后 4 种状态是 Spring MVC 中的值,在普通的 Spring 项⽬中只有前两种.

    singleton

    Bean 默认情况下是单例状态(singleton),也就是所有⼈的使⽤的都是同⼀个对象,之前我们学单例模式的时候都知道,使用单例可以很大程度上提高性能,所以在 Spring 中Bean 的作用域默认也是 singleton 单例模式。

    • 描述:该作用域下的 Bean 在 IoC 容器中只存在⼀个实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同⼀个对象.

    • 场景:通常无状态的 Bean 使用该作用域. (无状态表示 Bean 对象的属性状态不需要更新)

    prototype
    • 描述:每次对该作用域下的 Bean 的请求都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。

    • 场景:通常有状态的Bean使⽤该作用域.

    request
    • 描述:每次 http 请求会创建新的 Bean 实例,类似于prototype

    • 场景:⼀次 http 的请求和响应的共享 Bean

    • 备注:限定 SpringMVC 中使⽤

    session
    • 描述:在⼀个 http session 中,定义⼀个 Bean 实例

    • 场景:⽤户回话的共享 Bean , 比如: 记录⼀个⽤户的登陆信息

    • 备注:限定 SpringMVC 中使⽤

    application (了解)

    • 描述:在⼀个 http servlet Context 中,定义⼀个 Bean 实例

    • 场景:Web 应⽤的上下文信息, 比如:记录⼀个应用的共享信息

    • 备注:限定 SpringMVC 中使⽤

    websocket (了解)

    • 描述:在⼀个 HTTP WebSocket 的⽣命周期中,定义⼀个 Bean 实例

    • 场景:WebSocket 的每次会话中,保存了⼀个 Map 结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到 WebSocket 结束都是同⼀个 Bean。

    • 备注:限定 Spring WebSocket 中使⽤

    单例作用域 (singleton) VS 全局作用域 (application)

    • singleton 是 Spring Core 的作用域, application 是 Spring Web 中的作用域.

    • singleton 作用于 IoC 的容器, application 作用于 Servlet 容器

    Bean 作用域的设置

    @Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式

    使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

    @Component
    public class UserBeans {
      	@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        @Bean
        public User user1() {
            User user = new User();
            user.setId(1);
            user.setName("Gujiu");
            user.setPassword("123456");
            return user;
        }
    }

    直接设置值: @Scope("prototype")

    @Component
    public class UserBeans {
        @Scope("prototype")
        @Bean
        public User user1() {
            User user = new User();
            user.setId(1);
            user.setName("Gujiu");
            user.setPassword("123456");
            return user;
        }
    }

    Spring 执行流程

    • 启动容器 (启动项目)

    • 读取配置文件 (初始化)

      • 使用 xml 直接注册 Bean

      • 配置 Bean 根 (扫描) 路径

    • 将 Bean 存储到 Spring 中: 通过类注解进行扫描和装配

    • 将 Bean 装配到需要的类中 (取操作)

    Bean 生命周期

    所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。

    Bean 的生命周期:

    • 实例化 Bean (对应 JVM 中的 “加载”, 从无到有, 将字节码转换成内存中的对象, 只是分配了内存) [买了一套毛坯房]

    • 设置属性 (Bean 的注入和装配) [购买装修材料 (引入外部资源)]

    • Bean 初始化 [房子装修]

      • 实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法 [打电话给各个装修的师傅]

      • 执行 BeanPostProcessor 初始化前置方法 [师傅勘察环境, 指定装修方案 (前置工作)]

      • 执行 @PostConstruct 初始化方法,依赖注入操作之后被执行 [两类装修师傅进行装修]

      • 执行自己指定的 init-method 方法 (如果有指定的话) [两类装修师傅进行装修]

      • 执行 BeanPostProcessor 初始化后置方法 [装修之后的清理工作]

    • 使用 Bean [房子可以入住使用了]

    • 销毁 Bean [卖掉房子]

    生命周期演示

    BeanLifeComponent 类:

    //@Component
    public class BeanLifeComponent implements BeanNameAware {
    
        @Override
        public void setBeanName(String s) {
            System.out.println("执行了通知");
        }
    
        @PostConstruct
        public void postConstruct() {
            System.out.println("执行了 @PostConstruct");
        }
    
        public void init() {
            System.out.println("执行了 init-method");
        }
    
        @PreDestroy
        public void preDestroy() {
            System.out.println("执行了销毁方法");
        }
    }

    xml 配置:

    
    
    
        
    

    调用类:

    public class App2 {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext applicationContext =
                    new ClassPathXmlApplicationContext("spring-config.xml");
            BeanLifeComponent beanLifeComponent =
                    applicationContext.getBean("myComponent", BeanLifeComponent.class);
            System.out.println("使用Bean");
            applicationContext.destroy();
        }
    }

    运行结果展示:

    Java Spring中Bean的作用域和生命周期分析

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。