【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已经弃用)

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

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

相关文章

C语言——指针进阶(三)

目录 一.前言摘要 二.排序函数qsort的模拟实现 三.指针和数组笔试题解析 一.前言摘要 讲述关于strlen和sizeof对于各种数组与指针的计算规则与用法。另外还有qsort函数的模拟实现&#xff08;可以排序任意类型变量&#xff09; 二.排序函数qsort的模拟实现 目标&#xff1a;…

uniapp 模糊搜索(小白必看)

实现模糊搜索很简单,按照下面的步骤: 1. 搜索栏 <view class"search-box"><uni-search-bar class"uni-mt-10" radius"100" placeholder"请输入移交信息" clearButton"auto" bgColor"#F8F8F8"cancelBut…

开源库源码分析:Okhttp源码分析(一)

开源库源码分析&#xff1a;OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了&#xff0c;作为最常用的网络请求库&#xff0c;OkHttp以其强大的功能深受Android开发者的喜爱&#xff08;比如说我&#xff09;&#xff0c;还有对该库进行二次封装而成的热门库&a…

怎样下载和安装HBuilder软件?【附HBuilder快捷键】

HBuilder是一款深度集成Eelipse的IDE编辑器&#xff0c;但其主要集中在Web前端的开发&#xff0c;不能进行Java等后台开发。HBuilder提供了对JavaScrijpt、jQuery、HTML5、MUI等语法的提示功能&#xff0c;同时包含很多快捷键&#xff0c;让前端开发更加便捷。 访问HBuilder官…

首家!亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试

近日&#xff0c;在中国信通院“可信数据库”数据库迁移工具专项测试中&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧科技&#xff09;数据库数据同步平台V2.1产品依据《数据库迁移工具能力要求》、结合亚信科技AntDB分布式关系型数据库产品&…

vue 使用canvas 详细教程

Vue.js 中使用 Canvas Vue.js 是一个流行的 JavaScript 框架&#xff0c;用于构建用户界面。它提供了一种简洁的方式来管理和渲染数据&#xff0c;同时也支持与其他库和工具的集成。要在 Vue.js 中使用 Canvas&#xff0c;您可以按照以下步骤进行操作&#xff1a; 在 Vue.js …

vue3+scss开启写轮眼

vue3scss开启写轮眼 一、相关技术二、使用步骤1.安装依赖2.眼球3 勾玉4 旋转动画5 综合 一、相关技术 采用vue3vitescss的技术内容进行开发 二、使用步骤 1.安装依赖 代码如下&#xff1a; npm install sass2.眼球 首先我们根据需要 将眼睛的基础形状描绘出来&#xff0c…

SkyWalking入门之Agent原理初步分析

一、简介 当前稍微上点体量的互联网公司已经逐渐采用微服务的开发模式&#xff0c;将之前早期的单体架构系统拆分为很多的子系统&#xff0c;子系统封装为微服务&#xff0c;彼此间通过HTTP协议RESET API的方式进行相互调用或者gRPC协议进行数据协作。 早期微服务只有几个的情况…

Springboot 实践(15)spring config 配置与运用—自动刷新

目前&#xff0c;网络上讲解spring config的自动刷新&#xff0c;都是通过git服务站的webhook功能执行“actuator/bus-refresh”服务实现的自动刷新。我们的前文讲解的配置中心&#xff0c;配置中心仓库使用的时本地地址&#xff0c;如下图所示&#xff1a; 那么&#xff0c;配…

vim的使用介绍以及命令大全

懒羊羊感谢大家的关注和三连支持~ 目录 前言 一、vim的使用介绍 二、命令大全 1.命令模式 &#xff08;1&#xff09;复制&#xff08;配合粘贴命令p使用&#xff09; &#xff08;2&#xff09;剪切 &#xff08;3&#xff09;粘贴 &#xff08;4&#xff09;删除 …

GIS前端编程-Leaflet插件扩展

GIS前端编程-Leaflet插件扩展 Leaflet插件扩展基本原理Leaflet插件扩展开发方法1. L.Handler扩展2. L.Control扩展为了高效率地进行软件开发 Leaflet插件扩展基本原理 Leaflet是面向移动设备和Web的开源JavaScript库&#xff0c;具有设计简单、性能良好和可用性强的特点&#…

c#.NET技术做到ChatGPT流式响应并实现打字机效果 实现ChatGPT的Stream传输

.NET技术做到ChatGPT流式响应并实现打字机效果 ChatGPT是当前备受瞩目的人工智能产品之一&#xff0c;它具备与人类进行智能对话的能力&#xff0c;同时能够理解人类的想法和需求。在内容创作、营销、智能客服、教育、投资等领域和场景中&#xff0c;ChatGPT都展现出了巨大的…

【openKylin】OpenKylin1.0 x86_64 VMWare安装手册

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

选择器进阶与表单表格

华子目录 选择器并集选择器后代选择器子代选择器伪类选择器伪元素选择器结构选择器属性选择器相邻选择器 表单&#xff08;form&#xff09;label标签 表格&#xff08;table标签&#xff09;合并单元格 选择器 下面是我们之前学习过的选择器 *{}&#xff1a;通配符选择器&am…

分销小程序商城功能_小程序商城适合谁_OctShop

微信推出小程序后&#xff0c;分销小程序商城就受到了非常多企业和商家的关注&#xff0c;通过分销商城小程序企业或商家就可以获得庞大的用户裂变过来的用户&#xff0c;组成一个不断裂变拉新用户的网络&#xff0c;可以大大提高企业或品牌的曝光度&#xff0c;从而提高企业或…

视频图像处理算法opencv模块硬件设计图像颜色识别模块

1、Opencv简介 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Rub…

LeetCode 1282. Group the People Given the Group Size They Belong To【哈希表】1267

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

《优化接口设计的思路》系列:第二篇—接口用户上下文的设计与实现

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 前言 大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术…

Peppertype.ai:人工智能内容营销平台

【产品介绍】 名称 Peppertype.ai 具体描述 Peppertype.ai是一个AI驱动的文章生成工具&#xff0c;可以帮助你在几秒钟内为各种渠道创建吸引人 的内容。无论你是想要写广告文案、社交媒体标题、博客大纲还是网站内容&#xff0c;Peppertype…

基于SpringBoot蜗牛兼职网的设计与实现【附PPT|万字文档(LW)和搭建文档】

主要功能 前台界面&#xff1a; ①首页、兼职信息推荐、查看更多等 ②职位申请、申请日期、上传简历、点击下载简历、留言反馈等 ③个人中心、上传图片、更新信息等 后台登录&#xff1a; ①用户登录&#xff1a; 个人中心、修改密码、个人信息、职位申请管理 ②企业登录&…