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

news2025/7/13 9:08:18

文章目录

  • 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{

	//...
	@Overrride
	public Object getObject() throws Exception{
		return new Tank();  //汽车变坦克
	}
	
	@Override
	public 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{
	
	//...
	@Autowired
	private 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已经弃用)

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

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

相关文章

uview 组件 u-form-item 点击事件

问题 click"showCalendar(false)"点击没反应 原因&#xff1a; 组件未定义此事件&#xff0c;可使用原生点击事件.native click.native"showCalendar()" <u-form-item label"开始时间" label-width"150" right-icon"arrow…

戳气球00

题目链接 戳气球 题目描述 注意点 求戳破所有的气球所能获得硬币的最大数量0 < nums[i] < 1001 < n < 300 解答思路 初始只想到深度优先遍历暴力搜索所有情况找到获得硬币的最大数量&#xff0c;但是时间复杂度很高一定会超时参照题解使用动态规划解决本题&am…

机器人中的数值优化(十五)——PHR增广拉格朗日乘子法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

Python中的进度条显示方案

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 大家好&#xff0c;我是迷途小书童! tqdm 是一个非常常用的 Python 进度条库&#xff0c;它可以在循环迭代和 IO 操作期间添加一个进度条&#xff0c;直观地显示循环迭代的进程。 tqdm 是在 2013 年发布的&#xff0c;目的是为 Pyth…

netrw模拟nerdtree的go命令连续打开多个文件

vim9自带的文件浏览器netrw功能很强大。过去用惯了nerdtree的我&#xff0c;对netrw的文件操作还要适应一些时间。 使用netrw一段时间后发现它没有nerdtree的go命令的替代操作&#xff0c;今天就自制一个。 一、制作go命令&#xff1a; nerdtree的go命令功能&#xff1a;就是…

NetSuite 客户销售团队更新方法辨析

在NetSuite中如果想将销售团队与客户数据进行隔离&#xff0c;采用的方法是“在客户上定义销售团队&#xff0c;同时将销售团队成员的访问角色进行Employee Restrictions”。 其中&#xff0c;Employee Restrictions的主题我们过去发过几篇&#xff0c;大家可以参考。 NetSui…

【Blender】Blender入门学习

目录 0 参考视频教程0.1 Blender理论知识0.2 Blender上手实践0.3 FBX模型导入Unity 1 Blender的窗口介绍1.1 主界面1.2 模型编辑窗口 2 Blender的基本操作2.1 3D视图的平移2.2 3D视图的旋转2.3 3D视图的缩放2.4 修改快捷键2.5 使物体围绕选择的物体旋转2.6 四视图的查看2.7 局部…

Vivado 2017.04版本安装教程

文章目录 前言一、vivado 简介二、vivado 下载三、vivado 安装四、vivado 申请证书五、关闭升级提醒六、资源自取 前言 本文记录了在 windows 11 下安装 vivado 2017 的详细步骤。 一、vivado 简介 Vivado 是 Xilinx 公司于 2012 推出的新一代集成设计环境&#xff0c;虽然目…

【初阶C语言】操作符2---表达式求值

前言&#xff1a;本节重点介绍操作符的使用&#xff0c;如&#xff0c;优先级高低、类型转换等 一、逻辑操作符 前言&#xff1a;逻辑操作符包括逻辑与&#xff08;&&&#xff09;和逻辑或&#xff08;||&#xff09;&#xff0c;操作对象&#xff1a;两个 1.逻辑与&…

LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

10.Xaml ListBox控件

1.运行界面 2.运行源码 a.Xaml 源码 <Grid Name="Grid1"><!--IsSelected="True" 表示选中--><ListBox x:Name="listBo

腾讯云免费SSL证书申请流程(图文教程)

2023腾讯云免费SSL证书申请流程&#xff0c;一个腾讯云账号可以申请50张免费SSL证书&#xff0c;免费SSL证书为DV证书&#xff0c;仅支持单一域名&#xff0c;申请腾讯云免费SSL证书3分钟即可申请成功&#xff0c;免费SSL证书品牌为TrustAsia亚洲诚信&#xff0c;腾讯云百科分享…

coderforces round 894(div.3)

Problem - A - Codeforces AC代码: #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<set> #include<vector> #define endl \n //#define int long long using namespace std…

LeetCode——贪心篇(三)

目录 452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间 56. 合并区间 738. 单调递增的数字 968. 监控二叉树 刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 452. 用最少数量的箭引爆气球 有一些球形气球贴…

系统架构设计专业技能 ·结构化需求分析 - 数据流图

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 结构化需求分析 - 数据流图 一、数据流图的基本概念二、需…

操作系统——复习笔记

主要是按照王道考研408的ppt进行复习。 概述 操作系统概览 操作系统&#xff08;Operating System&#xff0c; OS&#xff09;是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方便的…

新装Ubuntu系统的一些配置

背景&#xff1a; 最近办公要在Ubuntu系统上进行&#xff0c;于是自己安装了一个Ubuntu22.04系统&#xff0c;记录下新系统做的一些基本配置。 环境 &#xff1a; 系统&#xff1a;Ubuntu-22.04内核&#xff1a;6.2.0-26-generic架构&#xff1a;x86_64 一、 配置root密码 新…

Brief. Bioinformatics2021 | sAMP-PFPDeep+:利用三种不同的序列编码和深度神经网络预测短抗菌肽

文章标题&#xff1a;sAMP-PFPDeep: Improving accuracy of short antimicrobial peptides prediction using three different sequence encodings and deep neural networks 代码&#xff1a;https://github.com/WaqarHusain/sAMP-PFPDeep 一、问题 短抗菌肽(sAMPs)&#x…

明牌空投 — 融资1200万美元的 AlienSwap 交互教程

本文仅为资讯分享&#xff0c;不构成任何投资建议&#xff0c;也不推荐您购买、出售或者持有任何加密货币。请读者朋友们 DYOR&#xff0c;理性看待区块链&#xff0c;提高风险意识&#xff0c;谨慎投资&#xff01; ★ 关于 AlienSwap AlienSwap 是一个基于社区的多链 NFT 聚…

基于Sentinel的微服务保护

前言 Sentinel是Alibaba开源的一款微服务流控组件&#xff0c;用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景&#xff0c;它基于流量提供一系列的服务保护措施&#xff0c;例如多线程秒杀情况下的系统承载&#xff0c;并发访问下的流量控制&#xff…