SpringBoot Bean解析

Bean解析

IOC介绍

  • 松耦合
  • 灵活性
  • 可维护

注解方式配置Bean

  • 实现方式1: @Component声明,直接类上进行添加注解, 同时保证包扫描能扫到即可
  • 实现方式2: 配置类中使用@Bean
@Configuration
public class BeanConfiguration implements SuperConfiguration{@Bean("dog")Animal getDog() {return new Dog();}}
  • 实现方式3: 实现FactoryBean
@Component
public class MyCat implements FactoryBean<Animal> {@Overridepublic Animal getObject() throws Exception {return new Cat();}@Overridepublic Class<?> getObjectType() {return Animal.class;}
}

使用时:

@Autowired
@Qualifier("myCat")
private Animal animal;
  • 实现方式4: 实现BeanDefinitionRegistryPostProcessor
@Component
public class MyBeanRegister implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();rootBeanDefinition.setBeanClass(Monkey.class);registry.registerBeanDefinition("monkey", rootBeanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}
  • 实现方式5: 实现ImportBeanDefinitionRegistrar
public class MyBeanImport implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();rootBeanDefinition.setBeanClass(Bird.class);registry.registerBeanDefinition("bird", rootBeanDefinition);}
}

框架核心refresh方法解析

  • Bean配置读取加载入口
  • spring框架启动流程
  • 重点面试

方法核心流程

粗略图:

详解图:

prepareRefresh

  • 设置容器状态
  • 初始化属性设置
  • 检查一下必备属性是否存在

obtainFreshBeanFactory

  • 设置beanFactory序列化id
  • 获取beanFactory

prepareBeanFactory

  • 设置beanFactory的一些属性
  • 添加后置处理器
  • 设置忽略的自动装配接口
  • 注册一些组件

postProcessBeanFactory

  • 子类重写以在BeanFactory完成创建后做进一步设置

invokeBeanFactoryPostProcessors

步骤1:

步骤2:

步骤3: 基本跟步骤2一致

步骤4:

总结:

  • 调用BeanDefinitionRegistryPostProcessor实现向容器内添加bean的定义
  • 调用BeanFactoryPostProcessor实现向容器内bean的定义的添加属性

registerBeanPostProcessors

  • 找到所有的BeanPostProcessors的实现
  • 按照排序的接口排序后依次实现注册到容器内

initMessageSource

  • 初始化国际化相关属性

initApplicationEventMulticaster

  • 初始化事件广播器注册到容器中

onRefresh

不同的子类作用不一样, 例如ServletWebServerApplicationContextonRefresh方法只做一件事情就是创建Web容器

registerListeners

  • 向事件广播器进行注册事件监听器
  • 派发早期事件

finishBeanFactoryInitialization

  • 初始化所有剩下的单实例bean

finishRefresh

  • 初始化生命周期处理器
  • 调用生命周期处理器onRefresh方法
  • 发布ContextRefreshedEvent事件
  • JMX相关的处理

resetCommonCaches

  • 事后的清理工作

Bean实例化流程解析

主要是在refresh方法中的finishBeanFactoryInitialization实现的

BeanDefinition介绍

  • 一个对象在Spring中描述,RootBeanDefinition是其常见实现
  • 通过操作BeanDefinition来完成bean实例化和属性注入

自定义创建bean

一般不需要,了解即可

@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if (beanName.equals("worker")) {return new Worker();}return null;}@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if (beanName.equals("worker")) {Worker worker = (Worker) bean;worker.setName("wangwu");}return false;}
}

面试题

  • 介绍一下ioc思想?
  • springboot中bean有哪几种配置方式分别介绍下?
  • bean的配貴你喜欢哪种方式?
  • 介绍下refresh方法流程?
  • 请介绍一个refresh中你比较熟悉的方法说出其作用?
  • 介绍下bean实例化的流程?
  • 说几个bean实例化的扩展点及其作用?

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

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

相关文章

深度学习:什么是知识蒸馏(Knowledge Distillation)

1 概况 1.1 定义 知识蒸馏&#xff08;Knowledge Distillation&#xff09;是一种深度学习技术&#xff0c;旨在将一个复杂模型&#xff08;通常称为“教师模型”&#xff09;的知识转移到一个更简单、更小的模型&#xff08;称为“学生模型”&#xff09;中。这一技术由Hint…

力扣11题 盛最多水的容器 双指针算法

11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明 你不能倾斜容器. 示…

AndroidStudio - 新版本 Logcat 使用详解

最近这俩天正好有时间给自己做一下减法&#xff0c;忘记是去年还是今年&#xff0c;在升级 AndroidStudio 后使用 Logcat查看日志的方式也发生了一些变化&#xff0c;虽然一直在使用&#xff0c;但每当看到之前还未关闭 Logcat 命令行工具额昂也&#xff0c;就感觉可能还存在知…

数据探索:五款免费数据可视化工具概览

数据可视化是解读和传达数据的重要方式&#xff0c;而现在有许多免费的工具可供选择&#xff0c;让您在探索数据时更轻松、更有趣。以下是五款推荐的免费数据可视化工具&#xff1a; Tableau Public&#xff1a; Tableau Public是一款功能强大的可视化工具&#xff0c;能够创建…

【网络安全】meterpreter攻击实战

1.meterpreter 攻击成功后可以做什么指令&#xff1f; 远程控制命令执行摄像头监控密码获取创建后门用户破坏篡改系统。 2.创建后门用户并开启远程连接&#xff1a; net user zhangsan 123456/add && net localgroup adminstrators zhangsan/add exit run getgul -…

如何计算数据泄露的成本

现在&#xff0c;几乎所有类型的组织每天都在发生企业 IT 网络遭到破坏的情况。它们是任何合规官员最担心的问题&#xff0c;并且找出更好的方法来防止它们或从中恢复是合规官员永远不会远离的想法。 但数据泄露的实际成本是多少&#xff1f;该数字从何而来&#xff1f;当您获…

Transformer中的多头注意力机制-为什么需要多头?

Transformer为什么使用多头注意力机制呢&#xff1f; 多头可以学习到不同维度的特征和信息。为什么可以学习到不同维度的信息呢&#xff1f; 答案是&#xff1a;多头注意力机制的组成是有单个的self attention&#xff0c;由于self attention通过产生QKV矩阵来学习数据特征&a…

中信建投在金融电于化期刊发布 DataOps 实践

文 ‖ 中信建投证券股份有限公司 马丽霞 高宇航 李可 许哲 李海伟 近年来&#xff0c;数据的分析和应用对各行各工业的业务模式和竞争形态进行重塑&#xff0c;而积极应对挑战和顺应时代变化是各个市场参与者的必选项。作为资本市场数字化转型的领航者&#xff0c;中信建投证券…

时序预测 | Python实现TCN时间卷积神经网络价格预测

时序预测 | Python实现TCN时间卷积神经网络时间序列预测 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 时间卷积网络,TCN。 利用CNN技术处理时间序列数据。 卷基础层有三种,第一种是一维CNN,用于输…

WebUI工作流插件超越ComfyUI

在AI绘画领域&#xff0c;Stable Diffsion是最受欢迎的&#xff0c;因为它是开源软件。 开源有两大优势&#xff0c;一是免费&#xff0c;二是适合折腾。 大量的开发者、爱好者投入无尽的热情&#xff0c;来推动Stable Diffsion的快速发展。 在图形界面方面&#xff0c;WebU…

Aria2 开发历程 (4) --使用RPC与 Aria2 进行通讯

结合这段时间搜集到到资料&#xff0c;比较理想的方案是通过RPC(websocket)来与运行时的Aria2&#xff08;必须是运作中&#xff09;进行通讯。 在配置文件和命令行都有RPC的相关配置&#xff1a; 例如:配置文件中的&#xff1a; ## RPC 设置 ### 启用 JSON-RPC/XML-RPC 服务…

麒麟操作系统网桥配置

网桥概念&#xff1a; Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备&#xff0c;其功能可 以简单的理解为是一个二层交换机或者 Hub&#xff1b;多个网络设备可以连接 到同一个 Bridge&#xff0c;当某个设备收到数据包时&#xff0c;Bridge 会将数据转发 给其他设备。…