Spring bean实例化时间点及相关若干问题

Spring Bean生命周期:Bean的初始化阶段 Spring Bean 生命周期系列】传送门 1、Spring Bean生命周期: Bean元信息的配置与解析阶段 2、Spring Bean生命周期: Bean的注册 3、Spring Bean生命周期: BeanDefinition的合并过程 4、Spring Bean生命周期: Bean实例化 5、Spring Bean生命周期:属性赋值阶段 写在前面 注:本文章使用的 SpringBoot 版本为 2.2.4.RELEASE,其 Spring 版本为 5.2.3.RELEASE 前言 接着上 阅读详情


简要说明Spring什么时候实例化bean,首先要分2种情况
  第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化
  第二:如果你使用ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况:
       (1):如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候, 直接从这个缓存中取
       (2):如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进行实例化
       (3):如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化

Spring中Bean的实例化过程
http://static.oschina.net/uploads/space/2011/1222/204039_9370_218421.jpg
打印Spring初始化bean的时间

  1. @Service
  1. publicclassBeanPostProcessorImplimplementsBeanPostProcessor{
  1. privatestaticfinalThreadLocal<Long> threadLocal =newThreadLocal<Long>();
  1. @Override
  1. publicObject postProcessBeforeInitialization(Object o,String s)throwsBeansException{
  1. long start =System.currentTimeMillis();
  1. threadLocal.set(start);
  1. return o;
  1. }
  1. @Override
  1. publicObject postProcessAfterInitialization(Object o,String s)throwsBeansException{
  1. System.out.println(o.getClass().getName()+", "+ s+" init time : "+(System.currentTimeMillis()- threadLocal.get()));
  1. return o;
  1. }
  1. }

获取所有bean refresh完事件通知

实现如下接口ApplicationListener<ContextRefreshedEvent>


Spring 对同一个文件import多次
  1. -applicationContext.xml(parent)
  2. -aContext.xml
  3. -bContext.xml(初始化)
  4. -cContext.xml(初始化)
  5. -bContext.xml(初始化,覆盖原来的bean
  6. -cContext.xml(初始化,覆盖原来的bean

Spring源码阅读笔记

注册bean的定义代码:

  1. AbstractBeanDefinitionReader.loadBeanDefinitions -->.. --> DefaultListableBeanFactory.registerBeanDefinition
  • 如果重复的bean name定义在同一个文件中,那么编译错误
  • 如果重复的bean name定义在不同的文件中,类型可以不一样,那么后加载的那个bean会将先加载的bean覆盖掉。(类型不一样时,可能导致其他类的引用出错)——weibo rpc的配置中,如果两个文件引用同一个refer,那么会报错nested exception is java.lang.IllegalStateException: Duplicate spring bean id
  • 如果多次import同一个文件,那么相当于在不同的文件中定义了相同的bean。
  • 如果allowBeanDefinitionOverriding被设置为false,那么不能有相同名字的bean。
  • 使用BeanPostProcessor打印bean的加载时间,顺序可能跟bean的初始化顺序不一致。

Xilinx IP库在Modelsim/Questasim中的高效仿真实践 本文详细介绍了在Modelsim/Questasim中高效仿真Xilinx FPGA设计的核心方法。针对仿真时常见的IP核缺失错误,重点解析了两种主流解决方案:使用Vivado的compile_simlib命令自动编译完整仿真库,以及利用export_simulation命令为特定工程生成仿真脚本。文章还提供了手动配置库的深入理解、实战排错步骤及高级避坑指南,帮助用户构建稳定、高效的独立仿真环境。 阅读详情

相关推荐

手把手教你学Simulink--进阶电机控制场景实例:基于Simulink的直流电机双闭环调速系统抗负载扰动仿真

摘要:本文基于Simulink平台构建直流电机双闭环调速系统,重点研究其在工业传送带场景下的抗负载扰动性能。系统采用转速外环(稳速)电流内环(限流)的嵌套结构,通过工程法整定PI参数,实现了转速跌落<10%、恢复时间<0.5s的优异抗扰性能。仿真结果表明,相比单闭环系统,双闭环控制使转速跌落率降低47%,恢复时间缩短75%。文中详细介绍了数学模型建立、Simulink模块实现及参数优化方法,并提供了完整代码模型文件,为电机控制系统设计提供实用参考。

MHD0815的博客 157

Spring Bean实例化时机与ApplicationContext中单例bean的延迟初始化

Spring Bean实例化时机 Spring什么时候实例化bean,分两种情况: 如果使用BeanFactory做为bean容器,则所有bean都是在第一次使用时才实例化; 如果使用的是ApplicationContext,则: 如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationConte...

拈花的专栏 1335

蒙古国国界,矢量数据,shp格式

蒙古国国界,矢量数据,shp格式。

dubbo Duplicate spring bean id的问题解析

近期,项目微服务开始提供RPC服务,微服务之间改为dubbo调用。本地开发调试时,服务提供方服务消费方都能正常启动,验证通过。 对于消费方,在bean的xml文件声明服务消费的引用方式: &lt;dubbo:reference id="operationWaybillService" interface="com.demo.service.OperationWaybillService" ...

熊孩子会撒野 1万+

spring bean初始化耗时统计

spring bean 的生命周期 实例化(instantiate), 用构造器创建一个对象 字段赋值(populate) 初始化(initialize), 执行bean配置里的init方法或者InitializingBean#afterPropertiesSet方法 销毁(destruct) 实例化字段赋值一般都很快,但是一些重型的bean被IOC容器创建时,需要调用远程服务或者执行耗时的...

bruce128的专栏 4514

springboot+dubbo启动失败Duplicate spring bean id

dubbo版本:2.6.5,springboot版本:1.5.17 问题描述 最近公司要将dubbo改为api配置方式,由于xml配置很多过渡期会混合使用两种配置。升级改造期间服务竟然报错重复bean id异常,异常堆栈如下 2019-05-31 09:43:00,620 ERROR [main] org.springframework.boot.SpringApplication:: App...

阿呆的专栏 3732

spring加载bean实例化顺序

http://guoliangqi.iteye.com/blog/632697 问题来源: 有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。 如果只是在A里单纯的写着: private B b; private String name = b.funb(); 会报错说nullpointException...

梦舞芳华 203

Spring Bean实例化过程源码解析

1 工程概述 1.1 pom <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.tar

qq_34125999的博客 1万+

springbean实例化的三种方式 -- Spring入门(二)

一、Bean实例化简介 二、bean实例化 -- 构造方法 三、bean实例化 -- 静态工厂实例化 四、bean实例化 -- 实例工厂FactoryBean 五、三种bean实例化方式的区别

HHX_01的博客 2447

Spring相关框架中的bean及其实例化

Spring 框架中,实例化通常是指创建一个对象的过程。具体来说,当你在 Spring 中配置一个 Bean(即 Spring 管理的对象)时,Spring 会负责实例化Bean 并将其存储在容器中。定义 Bean:首先,需要在 Spring 的配置文件(如 XML 文件或 Java 配置类)中定义一个 Bean。可以通过<bean>或@Component@Service等注解来定义 Bean。配置属性。

林隐的博客 1145

spring容器启动】之bean实例化初始化(文末附:spring循环依赖原理)

本次主要介绍ApplicationContext类型的Ioc容器实现,ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版本的Ioc容器实现BeanFactory,并进一步扩展了容器的功能,增加了bean的自动识别、自动初始化功能,同时引入了BeanFactoryPostProcessor、BeanPostProcessor等逻辑处理组件,目前我们的项目基本都基于A...

斜阳雨陌 1万+

Spring】使用@Bean@Import注解配置Bean,与Bean实例化

Spring 中,Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置管理这些 Bean 对象的生命周期。Spring IOC 容器会管理应用程序中的组件,并通过依赖注入(DI)将它们组装在一起。Bean 是应用程序的核心构建块,它们通常代表应用程序中的各种对象,例如服务、数据访问对象(DAO)、控制器等。

m0_65277261的博客 3327

Spring-bean实例化的方式

bean实例化的方式

weixin_52937170的博客 1314

Spring官网学习(二)IOCBean实例化

本章节主要是学习Spring官网的1.1、1.21.3节内容,有兴趣的同学可以跟着官网一起学习。 文章目录1、Spring容器IOC1.1、Spring容器是什么?1.2、Spring Bean是什么?1.3、IOC是什么?2、Spring容器如何实例化一个Bean2.1、Bean实例化2.2、构造方法实例化Bean2.2.1、Demo搭建 1、Spring容器IOC 1.1、Spri...

qq_36526036的博客 1204

Bean实例化过程

一、Spring容器的容器启动阶段Bean实例化阶段   1.1 容器启动阶段     容器启动阶段,主要是将利用某种工具(如XmlBeanDefinitionReader),将XML配置信息,映射为BeanDefinition,并将其注册到相应的BeanDefinitionRegistry。 1.2 Bean实例化阶段   本文主要探索此阶段,也就是上图Abstract...

子衿_青青的博客 6841

Duplicate spring bean id

问题背景:从本地调用服务器的dubbo接口进行测试 实现思路:基于IDEA+Spring+maven+Dubbo搭建测试项目,从本地直接调用      具体实现思路可参考博客:https://www.cnblogs.com/xiuxingzhe/p/9250737.html 碰到问题:引入测试目标jar后,调用其接口运行测试类时,报错如下 Caused by: java.lang....

weixin_34168700的博客 1301

java.lang.IllegalStateException: Duplicate spring bean id

java.lang.IllegalStateException: Duplicate spring bean id Spring Boot在整合Dubbo时,提供方启动没有任何问题。但到消费方启动时报如下错误 java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call ‘refresh’

白猿的博客 1万+

spring容器中类的初始化实例化时机

这边文章介绍了类的加载等相关内容,写的不错https://blog.csdn.net/justloveyou_/article/details/72466105 说的spring容器中bean的初始化实例化也不得不说类的加载机制。 上面的链接也很好的说了这一过程。 先抽出一部分要点: 类加载->连接(验证,准备,解析)->初始化->使用->销毁 其中类加载又...

坑里水库的博客 4591

Spring什么时候实例化Bean的?

今天忽然想到一个问题Spring是什么时候实例化Bean的? 1、是spring容器启动的时候? 2、还是第一次用到bean的时候实例化? 于是决定看一下源码 N年以前,spring还没有现在这么强大的时候,我们是如何使用spring的呢?使用XML文件配置,如下: public class SchoolServiceImpl { public String getTimeStr(){ return LocalDateTime.now().format(DateTim

特别享受思考问题的过程 2756

Duplicate spring bean id问题排查

现象 应用任务运行异常 {code} Caused by: java.lang.IllegalStateException: Duplicate spring bean id realnameAuthPubService at com.alibaba.dubbo.rpc.config.spring.schema.DubboBeanDefinitionParser.parse(D

只许关山度若飞 3万+

记录 Duplicate spring bean id dubbo

启动工程 报错如题:Duplicate spring bean id dubbo ,意思是id 重复。 原因是我在加载配置文件时加载了两个一样的配置文件: 在spring文件夹下 红框中的两个配置文件是一样的: 改为只加载一个就可以了(或者两个不加载)。

愿我如星君如月 ... 夜夜流光相皎洁 ... 4689
上一篇: 你应该知道的RPC原理
下一篇: Java agent实现JVM exception 统计
wongson
博客等级 码龄19年 76粉丝 59原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值