当前位置: 首页 > news >正文

【Spring面试】三、Bean的配置、线程安全、自动装配

文章目录

  • Q1、什么是Spring Bean?和对象有什么区别
  • Q2、配置Bean有哪几种方式?
  • Q3、Spring支持的Bean有哪几种作用域?
  • Q4、单例Bean的优势是什么?
  • Q5、Spring的Bean是线程安全的吗?
  • Q6、Spring如何处理线程并发问题?
  • Q7、Spring实例化Bean有几种方式?
  • Q8、什么是Bean的装配(依赖注入)?什么是Bean的自动装配(自动注入)?
  • Q9、自动注入有什么限制吗?
  • Q10、自动装配的方式有几种?

Q1、什么是Spring Bean?和对象有什么区别

答案:

  • Bean也是一个对象,但它是由Spring IoC容器管理的对象
  • Bean是一个由Spring IoC容器实例化、组装和管理的对象

举例:

在这里插入图片描述

在这里插入图片描述

Q2、配置Bean有哪几种方式?

答案:

第一种,使用xml文件配置

<bean class="com.llg.UserService" id="userService">

第二种:使用注解

前提:需要配置扫描包ComponentScan,否则以下注解无效:
- @Component@Component又分为:
- @Controller
- @Service
- @Repository

第三种:@Bean

标注于方法,return一个对象,这个对象就会成为一个Bean,和@Component不同,@Component依赖反射来创建实例

//@Bean可以自己来控制Bean实例化的过程@Bean
public DataSource dataSource(){//...// new xxx//设置dataSource对象的各种属性return dataSource;
}

第四种:@Import

//@Import只能用在类上 
//@Import通过快速导入的方式实现把实例加入spring的IOC容器中
@Import({ 类名.class , 类名.class... })
public class TestDemo {}
//对应的import的bean都将加入到spring容器中

Q3、Spring支持的Bean有哪几种作用域?

PS:

- 作用域的配置可以在xml中使用scope属性
- 也可在使用@Scope注解

答案:

共有5个:

  • singleton:单例,在每个Spring IoC容器中只有一个实例(默认)
  • prototype:多例,一个bean的定义可以有多个实例
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
  • session:在一个htpp Session中,一个ean定义对应于一个实例,该作用域仅限于Web Spring
  • application:一个全局的应用共享一个对象

Q4、单例Bean的优势是什么?

答案:

使用单例Bean,则不会每次都创建新的对象,因此在性能上有以下几点的优势:

  • 减少了新生成实例的消耗:一来Spring依赖反射来生成bean实例会消耗性能,给对象分配内存也涉及到复杂算法。二来减少服务器内存的消耗
  • 生成的对象少了,减少JVM回收
  • 可以快速获取到bean,因为单例bean的获取,除了第一次生成之外其余都是在缓存中获取了,所以很快。

Q5、Spring的Bean是线程安全的吗?

答案:

  • 单例Bean不是线程安全的,如果类中声明了成员变量,且有对这个变量的读写操作,就会线程不安全
  • 但是,如果把成员变量声明在方法中(局部变量—),则单例Bean线程安全

demo演示:

定义一个单例Bean:其成员变量在某方法中有读写操作:

在这里插入图片描述

在这里插入图片描述

new两个线程,分别调用beanDemo方法:

在这里插入图片描述

简单分析下:线程1将username改成welcome:AAA后休眠的过程中,线程2将username改成welcome:QQQ,此时线程休眠结束,返回这个Bean的username属性,则都返回了welcome:QQQ:

在这里插入图片描述

如果将username改成beanDemo方法的局部变量,则没有此线程安全问题。

Q6、Spring如何处理线程并发问题?

A1: 将Bean设置为多例

@Bean
@Scope("prototype")
...

A2: 将成员变量放在ThreadLocal(本地线程)中

//修改UserMapper类
public class UserMapper{private ThreadLocal<String> username = new ThreadLocal<>();   //注意类型和之前的变化public String beanDemo(String uname){username.set("welcome:"+uname):   //set修改try{Thread.sleep(10); }catch(InterruptedException e){e.printStackTrace();}return username.get();   //get拿值}
}

虽然现在线程1和线程2操作的是同一个UserMapper对象,但username是绑定在各自线程的,是各个线程独有的。

A3: 加同步锁,但这样会影响服务器的吞吐量,相当于把之前的并行改成了串行

在这里插入图片描述

Q7、Spring实例化Bean有几种方式?

A1: 构造器方式(反射)

比如使用xml或@Component定义一个Bean,则:
- BeanDefinition.beanClass
- 使用反射的new Instance,底层是在调用构造方法

A2: 静态工厂的方式

即定义Bean的时候配置下factory-method方法,则Spring实例化时会调用factory-method指定的方法去创建Bean,注意静态工厂指定的这个方法必须是静态的。

<bean class="cn.llg.beans.Person" id="person"  factory-method="createPerson">
</bean>

在这里插入图片描述

A3: 实例工厂的方式(@Bean)

在factory-method的基础上再指定factory-bean,则实例化时,用factory-bean调用factory-method来实例化

<bean class="cn.llg.beans.Person" id="person"  factory-bean="personFactory"factory-method="createPerson">
</bean>

别忘了BeanDefinition这个类,它里面就有对应属性存储factory-bean和factory-method

在这里插入图片描述
当使用@Bean时,则factoryBeanName就是你的那个配置类,而factoryMethodName就是@Bean注解下面的那个方法的方法名

A4: FactoryBean的方式

实现FactoryBean接口,重写getObject方法。

//之前的BeanFactory和FactoryBean区别时的那个FactoryBean
private class Car implements FactoryBean{//...@Overrridepublic Object getObject() throws Exception{return new Tank();  //汽车变坦克}@Overridepublic Class<?> getObjectType(){return Tank.class;}}

总结就是四种,且后面这三种,我们可以自己控制Bean的创建,不再由Spring掌控。

Q8、什么是Bean的装配(依赖注入)?什么是Bean的自动装配(自动注入)?

一个个Bean创建出来,没有自动装配(纯净态Bean)时,如果它的一个属性是另一个对象,则没有自动装配时,这个属性自然为空。之前的这种方式是手动装配

<bean id="bookService" class="com.llg.service.BookService><property name="bookDao" ref="bookDao" />
</bean>----
PS:对应的Java代码:
public class BookService{//...private BookDao bookDao;//...
}

简单说,自动装配即自动注入,就是Spring去建立Bean与Bean之间的依赖关系,对照上面的代码,自动注入即:

public class BookService{//...@Autowiredprivate BookDao bookDao;//...
}

Q9、自动注入有什么限制吗?

答案:

  • 一定要声明set方法
  • 覆盖:仍然可以用<constructor-arg> 和 <property> 配置来定义依赖,且这些配置将覆盖自动注入
  • 基本数据类型:不能自动装配简单的属性,如自动数据类型、字符串,但手动注入是可以的,如@Value
  • 模糊特性,自动装配不如显式装配精确
<bean id="bookService" class="com.llg.service.BookService><property name="bookDao" ref="bookDao1" />
</bean>//比如上面给bookService的bookDao属性装配,不管BookDao类型的Bean有多少,我就只要id为bookDao1的

Q10、自动装配的方式有几种?

在定义bean的xml中,输入autowired属性,就可以看到有5种:

在这里插入图片描述

在spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装载模式。在Spring框架xml配置中共有5种自动装配:

  • no:即默认不自动装配,需要手动设置ref属性来进行装配Bean
  • byName:通过bean的名称进行自动装配,如果有一个bean的name和待装配的bean的property相同(对应代码中的setXXX后面的XXX,而不是直接找属性名),则自动装配
  • byType:通过参数的类型来自动装配
  • constructor:利用构造函数进行装配,看构造函数的形参的类型去找,找到多个时再按形参名自动装配
public Class CarFactory{private Tank tank;public CarFactory(Tank tank) {this.tank = tank;  //按构造函数来自动装配}
}
  • autodetect:自动探测,若有构造方法,则按construct的方式,没有,则按byType的方式(在Spring3.0已经弃用)

相关文章:

【Spring面试】三、Bean的配置、线程安全、自动装配

文章目录 Q1、什么是Spring Bean&#xff1f;和对象有什么区别Q2、配置Bean有哪几种方式&#xff1f;Q3、Spring支持的Bean有哪几种作用域&#xff1f;Q4、单例Bean的优势是什么&#xff1f;Q5、Spring的Bean是线程安全的吗&#xff1f;Q6、Spring如何处理线程并发问题&#xf…...

flink连接kafka报:org.apache.kafka.common.errors.TimeoutException

测试flink1.12.7 连接kafka&#xff1a; package org.test.flink;import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutio…...

sql order by 排序 null值放最后,怎么写

在 SQL 中&#xff0c;可以使用 ORDER BY 子句对结果进行排序。如果要将 NULL 值放在最后&#xff0c;可以在排序列中使用 CASE 表达式来处理。 下面是一个示例查询&#xff0c;将 NULL 值放在最后进行排序&#xff1a; SELECT column1, column2 FROM your_table ORDER BY CAS…...

HDMI字符显示实验

FPGA教程学习 第十五章 HDMI字符显示实验 文章目录 FPGA教程学习前言实验原理程序设计像素点坐标模块字符叠加模块 实验结果知识点总结 前言 在HDMI输出彩条的基础上输出osd叠加信息。 实验原理 实验通过字符转换工具将字符转换为 16 进制 coe 文件存放到单端口的 ROM IP 核…...

Spring Cloud 框架搭建

Spring Cloud 框架搭建之一基础框架 创建父项目创建子项目 创建父项目 第一步&#xff1a;新建项目&#xff0c;填写基础信息 第二步&#xff1a;这里不需要其他组件直接点next即可。 第三步&#xff1a;pom文件添加下述代码&#xff0c;将父项目设置为pom文件形式打包&#…...

20个非常有用的单行Python代码片段

1. 写在前面 继上篇&#xff0c;继续在本文分享 20 个 Python 单行代码&#xff0c;可以在 30 秒或更短时间内轻松学会。这些单行代码不仅可以提高效率&#xff0c;同时使代码看起来更整洁、更易读。&#xff1a;&#xff09; 个人博客&#xff1a; https://jianpengzhang.git…...

【LangChain系列 9】Prompt模版——MessagePromptTemplate

原文地址&#xff1a;【LangChain系列 9】Prompt模版——MessagePromptTemplate 本文速读&#xff1a; MessagePromptTemplate MessagesPlaceholder 在对话模型(chat model) 中&#xff0c; prompt主要是封装在Message中&#xff0c;LangChain提供了一些MessagePromptTemplat…...

ROS2的学习路径

学习ROS2的建议学习路径&#xff1a; 理解基础知识&#xff1a; 熟悉机器人操作系统&#xff08;ROS&#xff09;的概念及其架构。了解ROS2相对于ROS1的优势以及其提供的关键功能。 安装和配置&#xff1a; 在你选择的操作系统上安装ROS2&#xff08;如Ubuntu、Windows、macOS…...

Maintaining leader role through timed lease mechanism

Continuous understanding of distributed systems design On the one hand 基于定时的租约机制来保持leader角色 基于定时的租约机制来保持leader角色的设计思想是一种在分布式系统中确保高可用性和系统一致性的解决方法。 在分布式系统中&#xff0c;通常会有一个角色被选举…...

Mysql InnoDB引擎 的hash索引

Mysql InnoDB引擎不支持hash索引&#xff0c;但是在内存结构中有一个自适应hash索引&#xff0c;来提高查询性能 当设置hash索引时会自动转换成btree索引 查一下mysql官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/create-index.html innodb_adaptive_hash_i…...

23年PMP考试如何备考?

接下来我要分享的备考建议分为三个部分&#xff0c;考试相关、备考期间注意和刷题建议。 1、PMP考试相关 PMP考试时间一定不能忘记&#xff0c;要密切关注&#xff0c;或许会出现延期的情况。考试教材现在是第七版教材&#xff0c;建议买一本或者用pdf电子版打印出来&#xf…...

mysql数据库增量备份方案、备份计划(InsCode AI 创作助手)

一、备份计划 以下是MySQL数据库增量备份的一般计划&#xff1a; 创建完整备份&#xff1a;在自动备份计划开始前&#xff0c;先创建一次完整备份。这个备份将包含所有数据和表结构。保存增量备份&#xff1a;在每次备份计划完成后&#xff0c;保存增量备份。这个备份将包含从…...

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18 而数据库中原始数据如下,并没有到下午5点…...

Javas | DecimalFormat类、BigDecimal类、Random类

目录&#xff1a; 1.DecimalFormat类2.BigDecimal类3.Random类4.需求&#xff1a;编写程序&#xff0c;生成5个不重复的随机数 1.DecimalFormat类 DecimalFormat 是 NumberFormat 的一个具体子类&#xff0c;用于格式十进制数字。 /*** 关于数字的格式化*/ public class Decima…...

机器学习 实战系列 总目录

1、机器学习实战-系列教程1&#xff1a;线性回归入门教程&#xff08;项目实战、原理解读、源码解读&#xff09; 机器学习实战-系列教程1&#xff1a;线性回归入门教程&#xff08;项目实战、原理解读、源码解读&#xff09; 2、机器学习实战-系列教程2&#xff1a;手撕线性回…...

机器学习——贝叶斯(三种分布)/鸢尾花分类分界图/文本分类应用

0、前言&#xff1a; 机器学习中的贝叶斯的理论基础是数学当中的贝叶斯公式。这篇博客强调使用方法&#xff0c;至于理论未作深究。机器学习中三种类型的贝叶斯公式&#xff1a;高斯分布&#xff08;多分类&#xff09;、多项式分布&#xff08;文本分类&#xff09;、伯努利分…...

SOLIDWORKS Composer位置关键帧的使用

SOLIDWORKS Composer是专业的SOLIDWORKS及3D文件处理的动画制作软件&#xff0c;作为SOLIDWORKS 产品线下的一个明星存在。 SOLIDWORKS Composer几乎可以处理任何SOLIDWORKS的模型文件并将之转化成可以动作的机械动画&#xff0c;可以引用在企业的网站、产品说明书以及工作指导…...

PostgreSQL 流复制搭建与维护

文章目录 前言1. 配置环境1.1 环境介绍1.2 主库白名单1.3 主库参数配置 2. 流复制搭建2.1 备份恢复2.2 创建复制用户2.3 参数修改2.4 启动并检查2.5 同步流复制2.6 同步复制级别 3. 流复制监控3.1 角色判断3.2 主库查看流复制3.3 延迟监控3.4 备库查询复制信息 前言 PostgreSQ…...

【Redis】关于过期数据清除的一些策略

这里要讨论的为过期的数据是如何被清除的&#xff0c;也就是网上常常讨论的过期清除策略。 需要注意的是&#xff0c;redis除了会对过期的数据进行淘汰&#xff0c;也可以通过对内存大小进行限制&#xff0c;并对超出内存限制后进行数据淘汰。此时淘汰的数据未必是过期的&…...

动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能&#xff0c;它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 1、if if标签可通过test属性的表达式进行判断&#xff0c;若表达式的结果为true&#xff0c;则标签中的内容会执行&#xff1b;反之标签…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...