spring 详解四 IOC(spring Bean生命周期)

14 篇文章 0 订阅
订阅专栏
SpringBean的生命周期包括实例化、初始化和完成阶段。在实例化阶段,通过反射创建对象;初始化阶段涉及属性填充、Aware接口调用、初始化方法执行等;完成后,Bean存储在单例池中。循环依赖通过三级缓存解决,Aware接口允许框架注入底层对象。
摘要由CSDN通过智能技术生成

spring生命周期概述

spring Bean的生命周期是从Bean实例化之后,即通过反射创建对象之后,到Bean成为一个完整对象,最终存储在单例池中,然后在销毁的过程被称为spring Bean的生命周期,这部分不会介绍销毁过程,只要在从无到有的创建过程

Bean的实例化阶段:spring框架会从BeanDefinitionMap中取出BeanDefinition定义信息判断当前Bean的范围是否是singleton,是否是延迟加载,是否是工厂方法实例化等,最终通过反射创建出Bean对象

Bean的初始化阶段:Bean创建之后仅仅只是个半成品,还需要对Bean进行DI,也就是popluate属性填充,执行一些Aware接口方法,执行BeanPostProcessor#before方法,执行InitializingBean接口初始化方法,执行自定义初始化方法,BeanPostProcessor#after方法执行,该阶段是spring的重要阶段,Aop功能的实现,注解功能,循环依赖功能均在此阶段

Bean的完成阶段:经过初始化阶段,Bean就成为了一个完整的sping Bean,被存储到单例池singletonObjects中去了,到此为止,即完成了springBean的整个生命周期

 spirng生命周期图

spring属性填充和三级缓存解决循环依赖 

属性填充位置

BeanDefinition中有对当前Bean实体的注入信息通过属性propertyValues进行存储注入

 属性注入规则

普通属性注入时,String,int或者存储基本类型的集合时,直接通过set方法的反射注入

注入单项对象引用属性时,先从容器中getBean获取后在通过set方法反射设置进去,如果容器中没有,则先创建对象Bean实例,在注入操作

注入双向对象引用属性时,即涉及到了循环引用问题(解决方案是三级缓存)

spring循环依赖问题 

当两个对象互相引用对方对象的时候,就出现了循环引用问题,下面造一个循环引用的问题

package com.tech.test.testbean;

import com.tech.test.service.UserService;


public class DI {

    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}
package com.tech.test.service.impl;

import com.tech.test.service.UserService;
import com.tech.test.testbean.DI;

public class UserServiceImpl implements UserService {


    private DI di;

    public void setDi(DI di) {
        this.di = di;
    }

    @Override
    public void getUser() {
        System.out.println("get User Success");
    }


}
  <bean id="userService"  name="aaa,bbb"  class="com.tech.test.service.impl.UserServiceImpl" >
        <property name="di" ref="di"></property>
    </bean>


    <bean id="di"  class="com.tech.test.testbean.DI" autowire="byName">
        <property name="userService" ref="userService"></property>
    </bean>

 在上边定义的循环引用问题是 userService对象引用了di对象,di对象又引用了userService对象,出现了循环引用问题,也就是死循环

 解决循环依赖问题(三级缓存)

 spring解决循环依赖问题引入了三级缓存

1、实例化对象,没有进行属性注入等初始化操作,会放入三级缓存,这时候的对象是一个半成品,没有被引用

2、当半成品对象被其他对象引用的时候,这个时候将对象放入二级缓存,删除三级缓存,

3、当引用对象的实例化和初始化都完成了进入一级缓存 ,删除二级缓存

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {

	/** Cache of singleton objects: bean name to bean instance. */
    // 存储单例Bean成品的容器,一级缓存
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

	/** Cache of early singleton objects: bean name to bean instance. */
   // 早期的Bean单例池,缓存半成品对象,且对象已经被引用啦,二级缓存
	private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

	/** Cache of singleton factories: bean name to ObjectFactory. */
   // 单例Bean的工厂池,缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean 三级缓存
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);



}

上述实例填充步骤:

1、userService实例化对象,分配内存地址,但尚未初始化,将userService存储到三级缓存

2、userService属性注入,需要DI对象,从缓存中取,没有DI对象

3、DI实例化对象,分配内存地址,但尚未初始化,将DI存入三级缓存

4、DI属性注入,需要userService,从三级缓存中取userService,userService从三级缓存中移除,放入二级缓存

5、DI执行初始化,最终成为一个完整的bean,存到一级缓存,移除二级缓存

6、userService 注入DI

7、userService执行初始化等流程,最终形成一个bean,放入一级缓存,移除二三级缓存

 spring中的Aware接口

 Aware接口是一种框架辅助属性注入的一种思想,简单直白的说,就是框架通过Aware接口给我们注入框架底层使用的对象,其他框架也有类似的Aware接口,框架具有高度封装性,底层API不能轻易的获取到,框架通过Aware接口给使用者注入该对象

在属性注入之后执行Aware方法

 常见的Aware接口

Aware接口回调方法作用
ServletContextAwaresetServletContext(ServletContext context)spring框架回调方法注入servletContext对象,web环境生效
BeanFactoryAwaresetBeanFactory(BeanFactory factory)spring框架回调方法注入beanFactory对象
BeanNameAwaresetBeanName(String beanName)spring框架回调方法注入当前Bean在容器中的beanName

ApplicationContextAware

setApplicationContext(ApplicationContext applicationContext)spring回调方法注入applicationContext对象
package com.tech.test.service.impl;

import com.tech.test.service.UserService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class UserServiceImpl implements UserService, ApplicationContextAware, BeanNameAware {


    @Override
    public void getUser() {
        System.out.println("get User Success");
    }


    @Override
    public void setBeanName(String name) {
        System.out.println(name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println(applicationContext);
    }
}

 可以看到 ,spring框架帮我们注入了bean的名称和applicationcontext对象

SpringIOC容器注入Bean的五种方式详解
08-25
Spring 框架中,IOC(Inverse of Control,控制反转)容器是核心组件之一,用于管理 Bean 的生命周期。在 Spring 中,IOC 容器可以通过五种方式来注入 Bean,本文将对这五种方式进行详细的介绍。 一、@Import 导入...
SpringIOC/Bean生命周期原理(思维导图)
起起落落的博客
06-07 419
个人对SpringIOC/Bean生命周期源码跟踪分析的笔记与总结,建议读者亲自打断点调试跟踪源码。
springbean的生命周期详解
08-26
"SpringBean的生命周期详解" Spring框架是当前Java EE开发中最流行的框架之一,Spring框架中Bean的生命周期是指从创建到销毁的整个过程。在这个过程中,Spring IOC容器对Bean的生命周期进行管理,使得开发者可以...
Spring配置使用之Bean生命周期详解
08-29
Spring 配置使用之 Bean 生命周期详解 Spring 配置使用之 Bean 生命周期详解是指在 Spring 框架中,Bean 从创建到销毁的整个过程。这个过程是非常重要的,因为它决定了 Bean 的生命周期和行为。 基本概念 在 ...
springboot项目打包后在终端运行显示没有主清单属性
weixin_52236586的博客
10-20 111
注释pom文件中的这个。
springsecurity使用
ghx123456ghx的博客
10-17 308
首先进入免登录的首页,当点击链接进入受到保护页面时,此时因没有登录,页面自动跳到登录页面,在登录页面输入有USER角色的账号时,自动跳到请求的href="/user/index"后台。2 springsecurity配置。3 登录跳转被保护页面流程。
JavaWeb合集05-SpringBoot基础知识
qq_57340195的博客
10-17 932
Autowrite :自动装配,通过声明的数据类型来装配对应的bean对象。缺点,只能获取到一个相同类型的bean对象,如果有IOC容器里面有2个Bean对象,使用@Autowrite依赖注入就好报错。由于三层架构中,每一层都需要下次成来提供对应的方法,所有要new 下一次的对象,如果上一层的类名发送改变,那么上一层就需要修改对应的类名,如下。3、@Resource注解:通过它来代替@Autowrite注解,直接指定要注入的Bean对象,参数name的值就是要注入的Bean对象。
Springboot整合knife4j生成文档
Think_and_work的博客
10-16 393
null
车辆管理的SpringBoot技术革新
2401_85760095的博客
10-18 1041
目前,界面设计已经成为对软件质量进行评价的一条关键指标,一个好的用户界面可以使用户使用系统的信心和兴趣增加,从而使工作效率提高,JSP技术是将JAVA语言作为脚本语言的,JSP网页给整个服务器端的JAVA库单元提供了一个接口用来服务HTTP的应用程序。B/S架构给使用管理系统的用户带来极大的便利。6、网络上的客户端和服务器可以用来编程任何独立的编程环境,也有中国,GB2312,BIG5,日文写作,一般基金,用于支持多国语言,并且可以嵌入在数据表和其他软件shift_jis访问柱可以用作的名称。
SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十
pingguocu3的博客
10-16 814
5 添加application.yml文件,cloudalibaba-provider-payment9003 和 cloudalibaba-provider-payment9004端口不同。6 添加启动类,cloudalibaba-provider-payment9003 和 cloudalibaba-provider-payment9004类名不同。8 创建cloudalibaba-consumer-nacos-order84微服务,pom依赖。著作权归作者所有,转载或内容合作请联系作者。
SpringBoot集成Minio实现文件上传
最新发布
weixin_55049722的博客
10-23 387
以上则为简单的MinIO使用案例,其还有更多强大的功能,还包括数据加密、访问控制、版本管理等功能。官方提供的 SDK非常全面官方文档,可以很轻松地在应用中完成整合。总之MinIO是一个非常强大的且可靠对象存储系统,值得信赖和推广。
SpringBoot驱动的车辆信息管理平台
2401_85761003的博客
10-18 1080
在概念模式的设计中,E-R模型法是最常见的设计方法。B/S架构的运行方式是在远程的服务器上把开发的软件系统部署在远程的服务器上,在部署好软件系统之后就可以实现在任何接入互联网的电脑上访问部署好的软件系统。6、网络上的客户端和服务器可以用来编程任何独立的编程环境,也有中国,GB2312,BIG5,日文写作,一般基金,用于支持多国语言,并且可以嵌入在数据表和其他软件shift_jis访问柱可以用作的名称。编程语言,如C, C ++,Python和Java的,的Perl,PHP,埃菲尔铁塔,Ruby和Tcl的。
​​Spring6梳理20——基于注解管理之Spring全注解开发
haozihua的博客
10-23 167
以上笔记来源:尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)
spring-cloud-alibaba-nacos-config2023.0.1.*启动打印配置文件内容
tb_problem的博客
10-17 324
注:我是通过spring.config.import的方式引入配置文件的;如果通过bootstrap.yml则是另一种的配置方式;在开发测试过程中如果可以打印出配置文件的内容,方便确认配置是否准确;那么如何才可以打印出来呢;如果通过bootstrap的配置方式则需要如下配置。本文由博客一文多发平台。
SpringBoot内置的事件发布与订阅
七禾页话的博客
10-20 233
Getter/*** 文章 ID*/需要继承ApplicationEvent,因为阅读文章加一所以需要传入一个id来实现对阅读量加一的操作。
Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip
weixin_53180424的博客
10-18 403
本项目是一个应急救援物资管理系统,其手机界面设计简洁明了,通过多个选项卡和按钮实现功能分类。整个界面以绿色为背景,底部设有蓝色导航栏,提供清晰的视觉引导。该系统涵盖了物资管理的各个方面,包括物资信息的录入、查询、修改以及入库、出库等操作,同时支持用户个人信息的查看与修改。界面布局合理,空白区域的使用突出了功能模块,提高了用户体验。通过该系统,用户可以高效地完成应急救援物资的管理工作,确保物资管理的准确性和及时性。
TDengine数据库整合MyBatis实现SpringBoot项目CRUD
weixin_43564627的博客
10-23 124
TDengine数据库整合MyBatis实现SpringBoot项目CRUD。
Spring IoC容器的Bean生命周期管理详解
这提供了另一种控制Bean生命周期结束时操作的方式。 6. **代码实例**: 提供的`Person`类展示了如何在Spring中自定义一个Bean,包含了常见的生命周期回调方法:构造函数、`setName`和`getName`方法用于属性设置和...
写文章

热门文章

  • vue实现简单登录界面 5998
  • https证书配置(nginx) 2923
  • js压缩base64图片 2700
  • vue中使用axios 2560
  • 鸿蒙开发者工具安装及入门程序 2165

分类专栏

  • springCloud 13篇
  • spring family 14篇
  • 部署及运维 20篇
  • 工作中 8篇
  • java基础及高级 24篇
  • jvm 6篇
  • 数据库基础及高级(mysql、nosql) 10篇
  • k8s 6篇
  • python django
  • HarmonyOS鸿蒙开发 5篇
  • python爬虫 5篇
  • python基础及高级 5篇
  • 中间件及ELK 2篇
  • maven 1篇
  • Netty基础及高级 1篇
  • 前端星球 10篇

最新评论

  • linux搭建gitlab

    weixin_45251756: 麻了,我这边搭建的gitlab可以用,就是新建用户之后,需要重新启动一下gitlab,用户登录进去才能看到对应的内容

  • linux搭建gitlab

    小趴菜不能喝: gitlab-ctl tail 看下日志,排查下问题,可能是端口占用和网络问题

  • linux搭建gitlab

    weixin_45251756: 我这边就一直502

  • java中的ThreadLocal

    小趴菜不能喝: 共同进步

  • java中的ThreadLocal

    普通网友: 写的很详细,感谢博主的分享。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

大家在看

  • 网络安全(黑客)——自学2024
  • Linux:进程间通信——信号
  • 【精品毕设推荐】基于微信小程序的酒店管理系统设计与实现 541
  • 【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的外卖配送平台系统的设计与实现
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.哈希(3)(布隆过滤器和位图) 677

最新文章

  • gateway 整合 spring security oauth2
  • 若依 spring boot +vue3 前后端分离
  • Docker 搭建mysql
2024年32篇
2023年66篇
2022年22篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家重庆个性化玻璃钢雕塑定做价格潜山玻璃钢雕塑厂家罗山玻璃钢雕塑玻璃钢雕塑厂房江西玻璃钢仿铜雕塑厂家玻璃钢孔子雕塑哪家价格便宜长治玻璃钢海豚雕塑定制开原玻璃钢长颈雕塑海南玻璃钢仿铜雕塑促销玻璃钢雕塑美人鱼江西景区玻璃钢雕塑图片玻璃钢艺术雕塑行情玻璃钢雕塑报价厂家金华抽象玻璃钢雕塑多少钱耐高温玻璃钢雕塑规格齐全济宁玻璃钢雕塑生产厂家商场恐龙玩具美陈武威广场玻璃钢雕塑厂家吴忠玻璃钢雕塑厂家价格固安玻璃钢花盆花器河北耐高温玻璃钢雕塑摆件广安玻璃钢商场美陈清远玻璃钢仿铜人物雕塑造型厂家满城玻璃钢花盆花器崇州玻璃钢造型雕塑商场美陈评比表格四川玻璃钢雕塑摆件设计厂家安徽商场节庆美陈雕塑加工合肥玻璃钢雕塑诚信企业推荐周口景观园林校园玻璃钢雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化