IOC中Bean的生命周期

生命周期的各个阶段:

可以分为三个阶段:产生-使用-销毁

又可以分四个阶段:四个阶段  实例化 ->属性注入->初始化 ->销毁

实例化后到使用的初始化过程: 属性赋值 ->处理各种Aware接口->实现BeanPostProcessor的before方法->nitializingBean接口的初始化方法回调->实现BeanPostProcessor的after方法

Bean实例化流程概述:

Spring 容器在进行初始化时,会将 xml 配置的的信息封装成一个  BeanDefinition  对象,所有的
BeanDefinition 存储到一个名为 beanDefinitionMap Map 集合中去, Spring 框架在对该 Map 进行遍 历,使用反射创建Bean 实例对象,创建好的 Bean 对象存储在一个名为 singletonObjects Map 集合 中,当调用getBean 方法时则最终从该 Map 集合中取出 Bean 实例对象返回

扫描配置信息:

        在启动之处,Spring会加载Bean定义 loadBeanDefinitions方法,用xml,注解扫描等各种方式,将定义的所有Bean全部找到,存放到一个BeanDifinitionMap中去。

实例化Bean:

         通过工厂后处理器的接口,实现对Bean的修改或注册

  ApplicaContext通过遍历BeanDifinitionMap来创建对象。

        我们可以在BeanDefinitionMap 填充完毕, Bean 实例化之前,通过实现接口 BeanFactoryPostProcessor:来对实例化的类进行修改或者注册。
如下代码所示,我们自己创建类MyBeanFactoryPostPro 实现 BeanFactoryPostProcessor,并且重写了里面的postProcessBeanFactory方法,成功对BeanDifinitionMap中,Key为user,Value为User的map修改为,Key为user,value为Student,实现了对类的修改
public class MyBeanFactoryPostPro implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {//                通过ConfigurableListableBeanFactory 的getBeanDefinition方法获取beanDefinition对象,修改beanClassname,完成实例化对象的修改BeanDefinition    beanDefinition     =               configurableListableBeanFactory.getBeanDefinition("user");beanDefinition.setBeanClassName("com.apersource.test.Student");}
}

同理,我们在如下代码中,通过是实现BeanDefinitionRegistryPostProcessor接口,并且重写了里面的方法,来注册了一个Bean到BeanDifinitionMap中去。

public class MyBeanFactoryPostProcessor2 implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {//进行注册RootBeanDefinition definition = new RootBeanDefinition();definition.setBeanClassName("com.apersource.test.Student");beanDefinitionRegistry.registerBeanDefinition("stu2",definition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}

属性注入

通过populateBean方法为Bean内部所需的属性进行赋值填充,这些属性通常为@Autowired注解修饰的这些变量,Spring会通过三级缓存机制来进行属性填充,避免依赖闭环。

        我认为三级缓存的核心思想便是将实例化与属性赋值分开,将不完整的Bean先拿来使用,实现对依赖闭环的突破,再重新对每个Bean对象完成属性赋值(拙见)。

感知实现的Aware接口,并进行处理

 */
public class User implements BeanNameAware, InitializingBean {public String name;public User() {System.out.println("实例化~");}public void setName(String name) {System.out.println("属性赋值");this.name = name;}@Overridepublic void setBeanName(String s) {System.out.println("各种aware接口的使用");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("来自接口系统的初始化方法");}public void doinit(){System.out.println("自定义属性的初始化方法");}
}

如上代码所演示举例,我们获得一个不完整的Bean之后,对他进行属性赋值,之后首先Spring要处理的就是Aware接口的各种方法,如上实现了 BeanNameAware 接口,我们在其中输出一段语句,获取Bean时便可以清楚的看到执行顺序;

BeanPostProcessor

然后我们开始处理BeanPostProcessor的before和after方法,顾名思义分别在初始化前和初始化之后

public class MyPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("初始化前的后处理器");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("初始化后的后处理器");return bean;}
}

初始化的方法:

BeanPostProcessor的before和after方法之间

我们通过实现 InitializingBean 接口,重写里面的 afterPropertiesSet方法,实现了来自接口的初始化方法,在这之后我们如果有自定义的初始化方法并且声明在了配置文件中,会在基于接口的初始化方法之后执行,。

到此为止,一个完整的Bean对象将创建完成了,创建好的Bean对象存储在一个名为singletonObjectsMap集合

然后就是使用和销毁了;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大厂AI课学习笔记NO.66】TensorFlow

TensorFlow 这个框架,实在是太有名了,最近周红衣都在大力的宣传和讲解。 他说的是对的,人工智能,就是大力出奇迹,就是大量的算力,大量的数据,加上模型的加持,实现的智能感觉。 Goog…

《数字图像处理(MATLAB版)》相关算法代码及其分析(1)

目录 1 自适应中值滤波算法 1.1 函数定义 1.2 输入参数检查 1.3 初始化 1.4 自适应中值滤波过程 1.5 处理剩余未处理的像素 1.6 总结 2 计算输入数组的平均值 2.1 函数定义 2.2 注释 2.3 输入验证 2.4 计算平均值 2.5 总结 3 基于高斯模型的贝叶斯分类器 3.1 函…

有趣的CSS - 一串乱码

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是通过 css 来实现一段不停变化的 bug 乱码效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…

异常网络下TCP的可靠服务机制(慢启动、拥塞避免、快重传、快恢复)

目录 TCP超时重传拥塞控制概述慢启动和拥塞避免下面讲解发送端如何判断拥塞发生。 快速重传和快速恢复 本文描述TCP在异常网络下的处理方式 以保证其可靠的数据传输的服务 TCP超时重传 tcp服务能够重传其超时时间内没有收到确认的TCP报文段,tcp模块为每一个报文段都…

加密与安全_探索数字证书

文章目录 Pre概述使用keytool生成证书使用Openssl生成证书 (推荐)证书的吊销小结 Pre PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 PKI - 04 证书授权颁发机构(CA) & 数字证书 PKI - 数字签名与数字证…

mysql8修改密码

mysql8.0修改密码 windows下忘了MySQL8.0的密码,可以通过以下方式修改。 1、管理员方式打开cmd命令窗口 输入: net stop mysql接着输入: mysqld --console --skip-grant-tables --shared-memory2、管理员方式打开另外一个cmd窗口 输入&…

电脑要用多少V的电源?电脑电源输入电压是市电

台式电源的输出电压是多少? 电脑电源输出一般有三种不同的电压,分别是: 12V、5V、3.3V。 电脑电源负责给电脑配件供电,如CPU、主板、内存条、硬盘、显卡等,是电脑的重要组成部分。 工作电流根据不同的硬件及其使用状…

数据结构c版(2)——二叉树

本章我们来了解一下二叉树这一概念。 目录 1.树概念及结构 1.1树的概念​​​​​​​ 1.2 树的特点: 1.3 树的相关概念 1.4 树的表示​​​​​​​ 1.5 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 …

HTML+CSS:花式加载

效果演示 实现了一个动态加载文本效果&#xff0c;通过定义变量和应用动画效果来实现文本的动态展示。 Code <div class"container"><h1>loading...</h1> </div>:root {--text-color: orangered; /* 定义文本颜色变量为橙红色 */--inner-st…

设计模式(十二)享元模式

请直接看原文: 原文链接:设计模式&#xff08;十二&#xff09;享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定义 享元模式是结构型设计模式的一种&am…

java 企业培训管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 企业培训管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

【Linux取经路】文件系统——inode与软硬链接

文章目录 一、前言二、认识硬件——磁盘2.1 磁盘的存储构成2.2 磁盘的逻辑抽象 三、操作系统对磁盘的使用3.1 再来理解创建文件3.2 再来理解删除文件3.3 再来理解目录 四、硬链接五、软链接六、结语 一、前言 在之前的【Linux取经路】文件系统之被打开的文件——文件描述符的引…