SpringFramework:Bean的作用域和生命周期

Spring 中 Bean 的作用域与生命周期 还是用上面的案例,自定义作用域要用到@Scope注释,我们要在Bean@Component public class UserBeans { //@Scope("prototye") 也可以这么写。@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)//设置为 Prototype 模式 @Bean public User user(){ User user = new User();user.setName("小明");} }结果:现在已经成功了。 阅读详情

前言

Bean的定义:在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean。

简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了。而 bean 的定义以及 bean 相互间的依赖关系将通过配置元数据来描述。

一、 Bean的作用域

Spring Framework中Bean支持五种作用域。

在这里插入图片描述
五种作用域中,request、session 和 global session 三种作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于 web 的 Spring ApplicationContext 环境。

二、Bean的状态

根据经验,对有状态的 bean 应该使用 prototype 作用域,而对无状态的 bean 则应该使用 singleton 作用域。那么怎么区分Bean是否有无状态呢?

有状态对象:有实例变量可以标志其对象所处的状态。(有实例变量的对象,有存储数据能力)
无状态对象:无实例变量可以标志其对象所处的状态。(无实例变量的对象,无存储数据能力)

有状态对象

/**
 * 无状态bean
 */
class NotHasStateBeanTest {

    public NotHasStateBeanTest() { }

    public String notHasStateBean(){
        return "无状态bean";
    }
}

无状态对象

/**
 * 有状态bean
 */
class HasStateBeanTest {
    // 实例变量,存储当前对象状态
    private String beanName;

    public HasStateBeanTest(String beanName){
        this.beanName = beanName;
    }

    public String hasStateBean(){
        return "有状态bean-" + beanName;
    }
}

三、Bean的生命周期

在这里插入图片描述
Bean的生命周期如上图(使用XML实现Bean的创建),大致9步可以描述为:

  • IOC氢气读取XML配置文件,获取Bean的位置,将bean转化为BeanDefinition,后续通过BeanDefinition调用反射实现实例化对象。
  • 对象如果涉及到一些属性值 利用set方法设置一些属性值(主要方法是populateBean,此处可能涉及循环依赖)。
  • 查看是否实现*Aware(比如ApplicationContextAware),调用接口中实现的set方法,获取框架中的对象信息.
  • 查看框架中是否存在实现BeanPostProcessor接口,调用接口中实现的postProcessBeforeInitialization方法,在初始化之前做一些操作.
  • 查看类是否实现InitializingBean接口,调用afterPropertiesSet()方法,在Bean属性值设置好之后做一些操作.
  • 查看类中是否定义了init初始化方法,存在就调用实现初始化
  • 查看框架中是否存在实现BeanPostProcessor接口,调用接口中实现的postProcessAfterInitialization方法,在初始化之后做一些操作.
  • ====================================== 到此Bean可以被使用,下面是容器关闭 ============================
  • 查看类是否实现DisposableBean接口,调用destroy()方法,可以在销毁Bean之前做一些操作。
  • 查看类中是否定义了destroy-method销毁方法,存在就调用Bean销毁(只有单例Bean,才会由容器进行销毁,prototype的Bean交付之后,就不在进行管理).

注意:上面的步骤是完整步骤,并不是所有的所有的Bean都会实现那么多接口和方法,所以会出现不同,但是前后顺序不会变化.

可以看到代码实验结果如下:
在这里插入图片描述
在这里插入图片描述

四、bean什么时候被加载进来的?

bean对象是被IOC容器加载并实例化之后,放入IOC容器中。
首先要了解IOC容器的创建的机制。

  • IOC容器初始化
    • 容器环境的初始化
    • bean工厂的初始化(IoC容器启动首先会销毁旧工厂、旧Bean、创建新的工厂)
  • 读取和定义
    • 读取:通过BeanDefinitonReader读取我们项目中的配置(application.xml)
    • 定义:通过解析xml文件内容,将里面的Bean解析成BeanDefinition(未实例化、未初始化,只是将找到的bean进行了初步准备)
  • 实例化与销毁
    • Bean实例化(到此处才进行了bean对象的创建)
    • 初始化(注入)
    • 销毁缓存
  • 扩展点
    • 事件与多播、后置处理器

简单概括就是一下步骤

1、工厂初始化过程
2、解析xml到BeanDefinition,放到map
3、调用后置处理器
4、从map取出进行实例化( ctor.newInstance)
5、实例化后放到一级缓存(工厂)

项目中是如何实现IOC创建的?

方法一
ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:application.xml");

最简单通过ClassPathXmlApplicationContext直接创建ApplicationContext 这个IOC容器。

application.xml中定义了需要实例化的bean或者是需要扫描的bean路径

	<!--&lt;!&ndash;ioC相关&ndash;&gt;-->
	<bean id="userService" class="com.spring.test.impl.UserServiceImpl">
		<property name="name" value="测试"/>
	</bean>
	<context:component-scan base-package="com.spring.test.aop"/>

同样的ApplicationContext 实现对象还有
在这里插入图片描述
ClassPathXmlApplicationContext最终还是到了 ApplicationContext 接口,同样的,我们也可以使用绿颜色的 FileSystemXmlApplicationContext 和 AnnotationConfigApplicationContext 这两个类完成容器初始化的工作

方法二

web服务的方式

对应web项目,我们一般会在web.xml这个文件中定义一个DispatcherServlet。

	<servlet>
		<servlet-name>mvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:mvc-servlet.xml</param-value>
		</init-param>
		<!-- load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法) -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>mvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

看DispatcherServlet的继承关系
在这里插入图片描述
所以DispatcherServlet的创建过程中会走HttpServletBean的init方法,方法内部initServletBean是通过FrameworkServlet 实现的。

HttpServletBean{
	init(){
		protected initServletBean();
	}
}
FrameworkServlet extends HttpServletBean{
@Override
initServletBean(){
	initWebApplicationContext(){
		WebApplicationContext wac = createWebApplicationContext(rootContext);
		protected onRefresh(wac);
		}
	}
}

可以看出interface WebApplicationContext extends ApplicationContext也是一个IOC容器。IOC容器在此开始初始化工作。

方法三
@SpringBootApplication
public class MyBookApplication {
	public static void main(String[] args) {
		ApplicationContext context =SpringApplication.run(MyBookApplication.class, args);
	}
}

可以看出SpringApplication.run() 方法会完成以下步骤:

  • 创建 ApplicationContext :
    • 如果是普通的 Spring 应用,创建的是 AnnotationConfigApplicationContext。
    • 如果是 Web 应用,创建的是 AnnotationConfigServletWebServerApplicationContext。

五、IOC容器和beanfactory的关系

Spring的IoC容器有两个主要实现:

  • BeanFactory
  • ApplicationContext

其中,BeanFactory是最基础的IOC容器,而ApplicationContext是BeanFactory的扩展,提供了更多的企业级功能。

BeanFactory是Spring IoC容器的核心接口,定义了管理和获取Bean的基本方法。它的主要职责包括:

  • Bean的实例化 :根据配置信息创建Bean实例。
  • 依赖注入 :自动将Bean的依赖注入到目标对象中。
  • Bean的生命周期管理 :管理Bean的初始化、销毁等生命周期阶段。
  • 延迟加载 :默认情况下,BeanFactory支持延迟加载(Lazy Initialization),只有在需要时才会创建Bean。

BeanFactory的主要实现类是DefaultListableBeanFactory,它是Spring中最常用的底层容器。

ApplicationContext是BeanFactory的子接口,提供了更高级的功能,适用于企业级应用开发。除了具备BeanFactory的所有功能外,ApplicationContext还提供了以下特性:

  • 事件发布机制 :支持事件监听器模型,可以发布和监听自定义事件。
  • 国际化支持 :支持多语言资源文件(MessageSource)。
  • AOP支持 :内置对面向切面编程的支持。
  • 自动扫描和装配 :支持基于注解的自动装配(如@Component、@Autowired等)。
  • Web应用支持 :提供WebApplicationContext以支持Web环境。
教程:Bean作用域 Bean作用域 4 singleton作用域 4 prototype作用域 5 具有原型Bean依赖的单例Bean 7 Request, Session, Application, 和 WebSocket 作用域 7 初始网络配置 7 request作用域 8 session作用域 8 application作用域 9 websocket作用域 9 作用域 Bean 作为依赖项 9 选择要创建的代理类型 11 直接注入Request/Session引用 11 自定义作用域 11 创建自定义作用域 11 使用 阅读详情

相关推荐

Spring Boot核心特性、注解和Bean作用域

Spring Core 是 Spring Framework 的基础,为基于 Java 的应用程序提供了全面的编程和配置模型。这里是与 Spring Core 相关的一些关键术语和概念:Bean:在 Spring 中,“bean”是由 Spring 容器管理的 Java 对象。通常使用配置元数据来定义bean,可以在 XML、Java 注释或 Java 代码中指定。控制反转(IoC):Spring 的主要原则之一是控制反转(IoC),这意味着 Spring 容器负责管理bean的生命周期并注入其依赖项。

时代各有不同,青春一脉相承。 1476

Spring Bean的作用域和生命周期

介绍Spring Bean的6种作用域,Bean的生命周期,会基于xml配置文件的方式和注解实现方式在程序中演示生命周期的过程。

trong_ 的烂笔头 2638

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

主要介绍了浅谈Spring中Bean的作用域、生命周期,具有一定借鉴价值,需要的朋友可以参考下

详解Spring中Bean的作用域与生命周期

其实我们在IOC中创建的每一个bean对象都是有其特定的生命周期的,在Spring的IOC容器中可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。而既然存在单实例,那么就一定存在多实例。一般情况下,我们书写在IOC容器中的配置信息,会在我们的IOC容器运行时被创建,这就导致我们通过IOC容器获取到bean对象的时候,往往都是获取到了单实例的Bean对象,//*************************bean生命周期*****************

m0_69804655的博客 364

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 457

自动驾驶嵌入式修炼秘籍:理想L9自动驾驶域控制器拆解

自动驾驶嵌入式修炼秘籍:理想L9自动驾驶域控制器拆解

pathfinder888的博客 2548

Spring中Bean的作用域与生命周期

一、Bean的作用域 一般情况下,我们书写在IOC容器中的配置信息,会在我们的IOC容器运行时被创建,这就导致我们通过IOC容器获取到bean对象的时候,往往都是获取到了单实例的Bean对象。 这样就意味着无论我们使用多少个getBean()方法,获取到的同一个JavaBean都是同一个对象,这就是单实例Bean,整个项目都会共享这一个bean对象。 在Spring中,可以在元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。Scope属性有四个参数,具体的使用可以看下图:

java123456111的博客 2097

QQ技术大总结

此贴只是一些对q友有用的东西,也许有人知道,高手勿喷。进如正题~ 1. 进入访问受限的qq空间 在地址栏里输入 http://qqxoo.com/main.html?qqid=qq号这样就可能看对方的空间 http://qqshow-user.tencent.com/qq号/11/00 看mm的qq绣 http://shuqian.qq.com/qq号/ qq书签 ...

weixin_33845881的博客 1270

Spring源码学习(十一)---Bean的作用域和生命周期进行测试

这里主要是使用org.springframework:spring-beans:5.2.0.RELEASE进行分析 文章目录 1. 查看源码相关的快捷键 快捷键 作用 Ctrl + Shift+i 出现类似于预览的小窗口 Ctrl + Enter (接上步)完全打开源码 Ctrl + 鼠标左键 一步到位打开源码 = Ctrl + Shift+i –>Ctrl + Enter Alt+7 查看类的有什么方法 ctrl+f12 查看继承方法 ctrl+h 查看接口的实.

543

手把手教你校准垂起固定翼(VTOL)遥控器与电调:从零到飞的完整流程

本文详细介绍了垂起固定翼(VTOL)遥控器与电调的校准流程,从基础认知到飞行前检查,涵盖遥控器通道配置、电调校准、舵机方向调整等关键步骤。通过图文并茂的指导,帮助无人机爱好者安全完成VTOL调试,确保首飞成功。特别强调多旋翼模式、过渡模式和固定翼模式的设置要点,适合新手和进阶用户参考。

jenkins8butler的博客 355

DATCOM GUI——DATCOM-Tools使用介绍

简介 本工具以1976年美国空军稳定性与操纵性计算程序(USAF STABILITY AND CONTROL DIGITAL DATCOM PROGRAM)为基础进行开发,目的是提供更为简洁方便的外形输入方式,并带有三维绘图与气动特性输出功能。 安装与环境配置 1、 代码以Holy Cows公司提供的DATCOM程序为基础,首先下载其安装包(window,Linux均有)。 2、 安装到你想要的位置,注意不要有中文路径 3、 测试DATCOM是否能够正常运行。复制examples文件夹中的Citation

qq_40800981的博客 1万+

【Javaweb学习|Day11】SpringBoot原理|配置优先级、Bean的管理、原理及源码分析

SpringBoot支持多种配置方式,优先级从低到高依次为:yaml/yml文件 → properties文件 → Java系统属性(-D) → 命令行参数(--)。开发推荐统一使用yml格式。在Bean管理方面,默认采用单例模式(singleton),可通过@Scope注解修改作用域。对于第三方依赖的Bean,需使用@Bean注解声明,可置于启动类或专用配置类中。@Bean方法名默认作为Bean名称,支持依赖自动注入。SpringBoot通过自动配、内嵌服务器和约定优于配置等特性,极大简化了Spring应

2401_87144364的博客 638

TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践

1.NGC上的预构建发布容器进行部署,见《2.通过pip进行部署。3.从源头构建再部署。在实际开发中,我们常常面临这样的场景:本地笔记本为 Windows 系统,虽然可以访问 GitHub,但受限于硬件性能,编译大型项目(如 TensorRT-LLM)耗时过长;而公司或实验室提供的 Linux 服务器性能强劲,适合编译任务,但却因网络策略限制无法连接外网,尤其是无法访问 GitHub。。

xinvictory的专栏 1202

6. Bean 的作用域和生命周期

Spring Framework的主要功能是用来存储和读取Bean,Bean于Spring框架的地位可见一斑。本节的目的就是从作用域和生命周期的角度更加深入了解一下Bean对象。

干脆面la的博客 1140

PCL 点云配准-ICP算法(精配准)

ICP(Iterative Closest Point)算法是一种常用的点云精细配准算法。它通过迭代计算将一组点云变换到另一组点云的最佳位置,最终实现精确的对齐。ICP算法在每次迭代中选择与目标点云最接近的点作为对应点,通过计算最小化源点云和目标点云之间的均方误差(MSE)来进行刚性变换(包括平移和旋转)。

纵马踏花向自由 1724

端到端自动驾驶的精准测试场景开发

1. 背景介绍 自动驾驶技术的发展正在改变交通运输的未来,然而,要实现安全可靠的自动驾驶,需要进行大量的测试和验证。端到端自动驾驶系统的测试场景开发是实现这一目标的关键。本文将详细介绍端到端自动驾驶的精准测试场景开发,包括核心概念、算法原理、数学模型、项目实践,以及未来发展趋势。 2. 核心概念与联系

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1318

SpringBoot 核心笔记|自动装配 + Bean 管理 + 面试题一篇搞定

本文总结了SpringBoot开发中的核心知识点,包括配置优先级、Bean管理和自动装配原理三大部分。配置优先级从低到高依次为yml/properties文件、系统属性和命令行参数。Bean管理重点解析了单例Bean的线程安全问题和第三方Bean的注入方案。自动装配部分深入讲解了@Conditional条件注解和自定义Starter的实现原理。文章还整理了8个高频面试题及标准答案,涵盖SpringBoot核心特性、启动流程和跨域解决方案等内容。这些知识点既是面试重点,也是实际开发中解决问题的关键,建议结合源

qq_51572290的博客 443

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度解析 Spring 源码:探寻Bean的生命周期

深度解析 Spring 源码是一项庞大的任务,其中探究 Bean 的生命周期是其中一个重要的方面。在 Spring 框架中,Bean 的生命周期包括创建、初始化、使用和销毁等多个阶段。通过深入研究 Spring 源码,我们可以了解到 Spring 是如何管理这些生命周期的。在 Spring 中,Bean 的生命周期由容器管理,而容器在初始化 Bean 时会遵循一定的流程。这个流程包括实例化 Bean、设置 Bean 的属性、调用 Bean 的初始化方法以及在容器关闭时销毁 Bean。

忆~遂愿的博客 6269

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Bean的作用域

注意:自定义scope是不能够覆盖Singleton和Prototype作用域的自定义一个Scope,线程级别的Scope,在同一个线程中,获取的Bean都是同一个。跨线程则是不同的对象:(以下内容作为了解)第一步:自定义Scope。(实现Scope接口),可以直接用。第二步:将自定义的Scope注册到Spring容器中。</</</</第三步:使用scope测试程序@Test// 启动一个新的线程@Override}).start();

qq_43780610的博客 1188

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Bean的作用域及生命周期

一、Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext)。  内置支持的作用域分列如下: 作用域 描述 singleton 在每个Spring IoC容器中一个bean定义对应一个对象实例。 prototype 一个bean定义对应多个对

2万+

【Spring6】| Bean的作用域

【Spring6】| Bean的作用域

m0_61933976的博客 2235

Bean的生命周期

对于普通的 Java 对象,当 new 的时候创建对象,然后该对象就能够使用了。一旦该对象不再被使用,则由 Java 自动进行垃圾回收。而 Spring 中的对象是 bean,bean 和普通的 Java 对象没啥大的区别,只不过 Spring 不再自己去 new 对象了,而是由 IoC 容器去帮助我们实例化对象并且管理它,我们需要哪个对象,去问 IoC 容器要即可。IoC 其实就是解决对象之间的耦合问题,Spring Bean 的生命周期完全由容器控制。

qq_51468665的博客 1778

Spring Bean作用域深度解析:从单例原型到自定义作用域实战

在软件架构中,对象生命周期管理是核心设计原则之一,它决定了对象的创建、共享和销毁方式,直接影响应用的资源利用、线程安全和状态隔离。Spring框架通过Bean作用域机制,将这一原理工程化,提供了从全局单例到请求会话等不同粒度的生命周期管理方案。其技术价值在于,开发者无需手动管理复杂的状态隔离和依赖关系,通过声明式配置即可实现对象在不同上下文中的精准控制,从而提升代码的可维护性和可扩展性。这一机制在Web开发、微服务、游戏服务器等需要多层级状态隔离的应用场景中尤为重要。本文以游戏后端开发中常见的“场景内单例”

weixin_34347651的博客 431

带你彻底掌握Bean的生命周期

我们将深入研究Spring Framework的核心部分——Spring Bean的生命周期。

华为云官方博客 1141

Spring Bean生命周期详解

API的方式Xml文件方式properties文件的方式注解的方式spring中提供了一个类PropertiesBeanDefinitionReader,将xml中定义的bean解析为BeanDefinition对象,过程和xml的方式类似。下面通过properties文件的方式实现上面xml方式定义的bean。来个properties文件:beans.propertiescar.name=??car1.name=???user.name=???Java。

sxlishaobin的博客 764
上一篇: Spring框架:事务
下一篇: Spring框架:IOC和AOP理解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

贝多芬也爱敲代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值