Spring相关面试题(二)

13.Spring IOC容器的加载过程

四个形态

概念态---<Bean信息>---> 定义态----BeanDefinition---->纯净态----DI---->成熟态

对应Bean的生命周期

实例化 --> 属性注入 ---> 实例化

概念态---->定义态

  1. 实例化一个ApplicationContext的对象

  2. 调用bean工厂后置处理器完成扫描;

  3. 循环解析扫描出来的类信息;

  4. 实例化一个BeanDefinition对象来存储解析出来的信息

  5. 把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来以便后面实例化bean;

  6. 再次调用其他bean工厂后置处理器

定义态----BeanDefinition---->纯净态

  1. 当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用finishBeanFactoryinitialization方法来实例化单例的bean,实例化之前spring要做验证需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototype,是否 abstract等等;

  2. 如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实例化对象是通过构造方法反射,故而需要知道用哪个构造方法;

  3. 推断完构造方法之后spring调用构造方法反射实例化一个对象;注意我这里说的是对象、对象、对象;这个时候对象已经实例化出来了,但是并不是一个完整的bean,最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean;10:spring处理合并后的beanDefinition

纯净态----DI---->成熟态

  1. Spring处理合并的BeanDefinition

  2. 判断是否需要完成属性注入

  3. 如果需要,则开始注入

初始化

  1. 判断bean的类型回调Aware接口。

  2. 调用生命周期回调方法

  3. 如需要代理完成代理

创建完成

  1. 放到单例池中去。

14 Spring Ioc的扩展点

挑重点回答:

  1. BeanFactoryPostProcessor的postProcessBeanFactory方法

  2. BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry

  3. BeanPostProcessor实现类:在Bean的生命周期会调用9次Bean的后置处理器

  4. 初始化阶段回到用很多的Aware接口

  5. 在初始化和销毁中,也会有很多的回调方法。

15 SpringBean和JavaBean

被Spring IOC容器管理的对象都是Bean。

Java的类就是JavaBean

16 配置Bean的方法
  1. XML

  2. 注解:@Component @Service @Controller @Repository,需要配置扫描包,通过反射获得Bean

  3. JavaConfig :@Bean,用在方法上,可以自己控制对象的创建。

  4. @Import : @Import(A.class)

17 单例Bean的优势(单例模式的优势)?

单例:对象只会创建一次。

  1. 减少新的实例创建,减少了服务器性能和内存的消耗

  2. 对象少了,jvm需要回收的对象也就少了。

  3. 可以迅速获得到Bean,Bean除了第一次获得是在内存中,别的时候都是在缓存中获取。

18 Spring的Bean是不是线程安全的?

单例Bean会存在线程安全的问题,如果类中有成员变量,并且有读写操作,就会有线程安全的问题,把成员变量放到方法中就是线程安全的了。

  1. 使用多例解决线程安全问题。

  2. 把成员变量放的ThreadLocal中,ThreadLocal是每个线程独有的。

  3. 加同步锁,加入synchronized。

19 Spring实例化Bean有几种方式
  1. 构造器反射的方式(Spring管理,不能控制)。

  2. 静态工厂方式。

    <xml factory-method="createPersonFactory"/>

    然后回调用这个静态方法去实例Bean

  3. 实例化工厂方式@Bean

    <xml factory-bean="" factory-method=""/>

    @Bean底层就是通过这两个方式进行的。

  4. FactoryBean方式

    实现FactoryBean的getObject方法,在这个方法中返回一个对象,在getObjectType()中获得一个class。

20 Bean的装配,Bean的自动装配 (或者说注入)
  1. 通过XML配置可以装配上

  2. @Autowired或者其他注解,可以自动注入。

21 自动装配的条件
  1. 需要set方法

  2. 任然可以使用<constructor-arg/> 和 <propety/>进行覆盖

  3. 不能装配基本的数据类型

  4. 自动装配不如显示装配精确

23 自动装配的几种方式
  1. no:不进行自动装配,通过ref手动注入

  2. byName:

  3. byType:

  4. constructor:

  5. autodetect:Spring3.0后弃用.

24 Bean有哪些生命周期的回调方法?有哪几种实现方式?

1.初始化方法

  1. 注解方式:@PostConstruct

  2. 实现InitiallizingBean接口

2.销毁方法

1. 注解方式:@PreDestroy
2. 实现DisposableBean接口
3. @Bean(destroyMethod = “destroyMethod”)
25 Spring在加载过程中,有几种形态?
  1. 概念态

    @Bean <Bean/>Bean的配置形态。

  2. 定义态

    BeanDefinition 封装Bean的生产指标。

  3. 纯静态

    二级缓存,早起暴露Bean,循环依赖才能体现纯静态的作用。

  4. 成熟态

    SingletonObjects ,最终在应用使用的Bean

26 Spring是如何帮助我们在并发的情况下避免获取不完整的Bean

什么是不完整的Bean?

实例化之后,没有经过属性赋值。

双重检查锁和二次检查缓存

二个同步锁

再读二级缓存和三级缓存的时候,都有一把锁,如果A线程先进来,会进行Bean的实例化,这其中到放到一级缓存的过程中,都是锁住的,另外一个线程都是堵塞的状态,直到A线程创建完一个对象;但是B线程读的时候,一级缓存是没有加锁的,而且B此时已经读完了一级缓存,结果是null,同时A创建好了一个Bean,二级缓存和三级缓存都清空,B这个时候就得重新创建了吗???不是,在创建Bean之前,B线程也会再次进行getSingleton()的调用,这是就会直接拿到Bean。

为什么一级缓存不加锁呢?

性能问题:如果一个线程创建一个A Bean对象,但是另一线程要拿C Bean对象,这个时候这个线程也是堵塞的。

27 BeanDefinition的加载过程
  1. JavaConfig @Bean

  2. 解析配置类

    1. 读取配置:BeanDefinitionReader

    2. 解析:Config : @Bean @Import @Component

    3. 配置类解析器 ConfigurationClassParser

    4. 扫描:ClassPathBeanDefinitionSacnner # doScan:根据包路径找到所有的.class文件,判断类是不是标准的@Component注解,排除接口,是不是抽象类

    5. 注册BeanDefinition

  3. 注册BeanDefinitionMap

  4. 生产

28 如何在Spring所有Bean创建完后做扩展

哪里才算所有的Bean创建完成:new ApplicationContext() -----> refresh() ------> finishBeanFactoryInitialzation(循环所有的BeanDefinition进行getBeanFactory.getBean()生成所有的Bean) 这个循环之后Bean也就创建完了。

  1. 扩展方式一:基于SmartInitializingSingleton接口,在finishBeanFactoryInitialization(beanFactory); (源码在DefaultListableBeanFactory.java的preInstantiateSingletons()方法中),实现SmartInitializingSingleton接口,可以在所有单例bean全部实例化以后回调

  2. 扩展方式二:在AbstractApplicationContext.java中的finishRefresh()方法中,发布了一个最后的事件,publishEvent(new ContextRefreshedEvent(this));监听事件@EventListener(ContextRefreshedEvent.class)

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

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

相关文章

51单片机看门狗定时器配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 手册中关于看门狗的寄存器描述如下&#xff1a; 启动看门狗&#xff0c;需将B5位EN_WDT置1即可&#xff0c;…

postgresql.conf配置详解

postgresql.conf配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; postgresql.conf是PostgreSQL数据库的主要配置文件之一&#xff0c;它包含了各种配置…

ScheduledThreadPoolExecutor和时间轮算法比较

最近项目中需要用到超时操作&#xff0c;对于不是特别优秀的timer和DelayQueue没有看。 Timer 是单线程模式。如果某个 TimerTask 执行时间很久&#xff0c;会影响其他任务的调度。Timer 的任务调度是基于系统绝对时间的&#xff0c;如果系统时间不正确&#xff0c;可能会出现…

调和映照理论简介

调和映照理论 调和映照理论&#xff08;Harmonic Mapping Theory&#xff09;是数学中的一个重要分支&#xff0c;研究调和映照&#xff08;Harmonic Mapping&#xff09;及其性质。调和映照是指保持某种特定性质&#xff08;通常是调和性&#xff09;的映射&#xff0c;它在几…

Golang的Work Stealing机制

Go的运行时系统使用了一种名为Work Stealing&#xff08;工作窃取&#xff09;的调度策略来分配Goroutine到可用线程&#xff08;称为M&#xff0c;即Machine&#xff09;上执行。这样可以最大化CPU使用率&#xff0c;减少任务调度的开销。在这种机制下&#xff0c;任务队列和调…

STL中的迭代器模式:将算法与数据结构分离

目录 1.概述 2.容器类 2.1.序列容器 2.2.关联容器 2.3.容器适配器 2.4.数组 3.迭代器 4.重用标准迭代器 5.总结 1.概述 在之前&#xff0c;我们讲了迭代器设计模式&#xff0c;分析了它的结构、角色以及优缺点&#xff1a; 设计模式之迭代器模式-CSDN博客 在 STL 中&a…

Open AI限制来袭?用上这个工具轻松破局!

【导语】近日&#xff0c;AI领域掀起了一场不小的波澜。Open AI宣布&#xff0c;从7月9日起&#xff0c;将对部分地区的开发者实施API调用限制。这一消息对于许多依赖Open AI技术的国内初创团队来说&#xff0c;无疑是一个沉重的打击。 对于这些团队而言&#xff0c;Open AI的A…

FITC-胰岛素的荧光特性与稳定性-星戈瑞

在生物医学研究领域&#xff0c;荧光标记技术是一种实验手段&#xff0c;能够实现对生物分子的可视化追踪和定量分析。其中&#xff0c;FITC-胰岛素作为一种结合了荧光素异硫氰酸酯&#xff08;FITC&#xff09;与胰岛素的荧光标记物&#xff0c;在糖尿病研究、药物开发以及细胞…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片&#xff08;IR CUT Filter&#xff09;是应用在摄像头模组中非常重要的一个器件&#xff0c;因人眼与 coms sensor 对光线各波长的响应不同&#xff0c; 人眼看不到红外光&#xff0c;但 sensor 能感应到&#xff08;如下图是某sensor在各波长下的…

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 的选择器

文章目录 前言创建选择器组件使用选择器组件总结前言 最近,我一直在为我的应用开发一个全新的界面,它可以让你查看 TestFlight 上所有可用的构建,并允许你将它们添加到测试群组中。 作为这项工作的一部分,我需要创建一个组件,允许用户从特定构建中添加和删除测试群组。我…

IOS Swift 从入门到精通:从 JSON 文件加载数据

文章目录 常见问题解答数据模型JSON 数据验证 JSON解码 JSON编写 FAQRow 代码添加状态栏背景模糊将内容添加到 FAQView常见问题解答数据模型 此 FAQ 模型符合Decodable,因为我们需要将 JSON 数据解码为 SwiftUI 数据。它还将符合 Identifiable ,因此我们稍后可以在 ForEach …

Flutter学习目录

学习Dart语言 官网&#xff1a;https://dart.cn/ 快速入门&#xff1a;Dart 语言开发文档&#xff08;dart.cn/guides&#xff09; 学习Flutter Flutter生命周期 点击跳转Flutter更换主题 点击跳转StatelessWidget和StatefulWidget的区别 点击跳转学习Flutter中新的Navigato…

transformers evaluate

☆ Evaluate https://huggingface.co/docs/evaluate/main/en/installation ★ 解决方案 常用代码 # 查看支持的评估函数 evaluate.list_evaluation_modules(include_communityTrue)# 加载评估函数 accuracy evaluate.load("accuracy")# load function descripti…

uORF调控翻译-植物综述

这篇文献《uORFs: Important Cis-Regulatory Elements in Plants》详细介绍了上游开放阅读框&#xff08;uORF&#xff09;在植物中的重要调控作用。以下是文献的详细总结&#xff1a; 核心内容总结 1. 引言 基因表达的调控涉及多个层面&#xff0c;包括mRNA的转录、翻译和翻…

Linux操作系统通过实战理解CPU上下文切换

前言&#xff1a;Linux是一个多任务的操作系统&#xff0c;可以支持远大于CPU数量的任务同时运行&#xff0c;但是我们都知道这其实是一个错觉&#xff0c;真正是系统在很短的时间内将CPU轮流分配给各个进程&#xff0c;给用户造成多任务同时运行的错觉。所以这就是有一个问题&…

个人网站搭建-步骤(持续更新)

域名申请 域名备案 域名解析 服务器购买 端口转发 Nginx要在Linux上配置Nginx进行接口转发&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Nginx&#xff08;如果尚未安装&#xff09;&#xff1a; 使用包管理工具&#xff08;如apt, yum, dnf, 或zypper&#x…

高考志愿不知道怎么填?教你1招,用这款AI工具,立省4位数

高中的岁月&#xff0c;就像一本厚厚的书&#xff0c;我们一页页翻过&#xff0c;现在&#xff0c;终于翻到了最后一页。但这不是结束&#xff0c;这是新的开始&#xff0c;是人生的新篇章。 高考落幕&#xff0c;学子们在短暂的放松后&#xff0c;又迎来了紧张的志愿填报。 “…

【面试系列】最全的IT行业岗位要求及必备技能

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐️ 全流程数据技术实战指南:全面…

C++版本号处理3 - 版本号比较

1. 关键词2. verutil.h3. verutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词&#xff1a; C 版本号处理 版本号比较 跨平台 实现原理&#xff1a; 通过字符串分割&#xff0c;对每一段的版本号进行逐一比较。 应用场景&#xff1a; 要基于版本号做一些逻辑…

Android 自定义实现灯带跑马灯效果

public class MyMarqueeView extends View {private Paint paint;private RectF rect;private float startX, startY, endX, endY;private float currentX,currentY;/*** 灯大小*/private int radius 15;/*** 多少毫秒绘制一个圆点* 最小80*/private int time 100;/*** 绘制的…