【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.mzph.cn/news/78738.shtml

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

相关文章

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。

您所使用的密钥ak有问题&#xff0c;不支持jsapi服务&#xff0c;可以访问该网址了解如何获取有效密钥。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的&#xff0c;点击以后就进入…

【深度学习】 Python 和 NumPy 系列教程(廿二):Matplotlib详解:2、3d绘图类型(8)3D饼图(3D Pie Chart)

一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名&#xff0c;并且具有强大的功能和广泛的应用领域。Python具有丰富的标准库和第三方库&#xff0c;可以用于开发各种类型的应用程序&#xff0c;包括Web开发、数据分…

WebRTC 源码 编译 iOS端

1. 获取依赖工具 首先&#xff0c;确保你已经安装了以下工具&#xff1a; GitDepot ToolsXcode&#xff08;确保已安装命令行工具&#xff09; 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中&#xff1a; /path/to/depot_tools 替换为自己的路径…

unity C#客户端与服务器程序

客户端和服务器公共的脚本 OSC.cs // This is version 1.01(2015.05.27) // Tested in Unity 4 // Most of the code is based on a library for the Make Controller Kit1/* using UnityEngine; using System; using System.Collections; using System.Threading; using Syst…

Furion api npm web vue混合开发

Furion api npm web vue混合开发 Furion-api项目获取swagger.json文件复制json制作ts包删除非.ts文件上传到npm获取npm包引用 Furion-api项目获取swagger.json文件 使用所有接口合并的配置文件 复制json制作ts包 https://editor.swagger.io 得到 typescript-axios-clien…

怎么科学管理固定资产呢

在当今的商业环境中&#xff0c;固定资产的管理是企业成功的关键因素之一。然而&#xff0c;传统的固定资产管理方法往往过于繁琐&#xff0c;缺乏创新&#xff0c;导致资源的浪费和效率的低下。因此&#xff0c;我们需要一种新的、更加科学的方法来管理我们的固定资产。本文将…

C++多线程的用法(包含线程池小项目)

一些小tips: 编译命令如下&#xff1a; g 7.thread_pool.cpp -lpthread 查看运行时间&#xff1a; time ./a.out 获得本进程的进程id&#xff1a; this_thread::get_id() 需要引入的库函数有&#xff1a; #include<thread> // 引入线程库 #include<mutex> //…

Ui自动化测试上传文件方法都在这里了 ~

前言 实施UI自动化测试的时候&#xff0c;经常会遇见上传文件的操作&#xff0c;那么对于上传文件你知道几种方法呢&#xff1f;今天我们就总结一下几种常用的上传文件的方法&#xff0c;并分析一下每个方法的优点和缺点以及哪种方法效率&#xff0c;稳定性更高 被测HTML代码…

睿趣科技:抖音开店前期需要准备什么

抖音作为全球最受欢迎的短视频平台之一&#xff0c;已经成为了许多年轻人的创业和赚钱的机会。如果你计划在抖音上开店&#xff0c;那么在正式开业之前&#xff0c;有一些重要的准备工作是必不可少的。下面就是抖音开店前期需要准备的关键步骤和注意事项。 确定你的目标和产品&…

Matlab图像处理-三原色

三原色 根据详细的实验结果&#xff0c;人眼中负责颜色感知的细胞中约有65%对红光敏感&#xff0c;33%对绿光敏感&#xff0c;只有2%对蓝光敏感。正是人眼的这些吸收特性决定了所看到的彩色是一般所谓的原色红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;和蓝&…

动态渲染 echarts 饼图(vue 2 + axios + Springboot)

目录 前言1. 项目搭建1.1. 前端1.2. 后端 2. 后端数据渲染前端2.1 补充1&#xff1a;在 vue 中使用 axios2.2. 补充2&#xff1a;Springboot 处理跨域问题2.3. 修改前端代码2.3.1 修改饼图样式2.3.2 调用后台数据渲染饼图2.3.3 改造成内外两个圈 前言 因为上文中提到的需求就是…

内网隧道代理技术(二十五)之 ICMP隧道反弹SHELL

ICMP隧道反弹SHELL ICMP隧道原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道,可以实现绕过防火墙和入侵检测系统的阻拦。 ICMP隧道有以下的优点: ICMP…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…

数字化转型对企业有哪些优势?

数字化转型为企业提供了众多优势&#xff0c;帮助他们在日益数字化的世界中保持竞争力、敏捷性和响应能力。以下是一些主要优势&#xff1a; 1.提高效率和生产力&#xff1a; 重复性任务和流程的自动化可以减少人为错误&#xff0c;并使员工能够专注于更具战略性的任务。简化…

Apache Linki 1.3.1+DataSphereStudio+正常启动+微服务+端口号

我使用的是一键部署容器化版本&#xff0c;官方文章 默认会启动6个 Linkis 微服务&#xff0c;其中下图linkis-cg-engineconn服务为运行任务才会启动,一共七个 LINKIS-CG-ENGINECONN:38681 LINKIS-CG-ENGINECONNMANAGER:9102 引擎管理服务 LINKIS-CG-ENTRANCE:9104 计算治理入…

Vue开发小注意点

改bug 更改了配置项啥的&#xff0c;保存刷新发现没变&#xff0c;那就重启项目&#xff01;&#xff01;&#xff01;&#xff01; binding.value 和 e.target.value binding.value Day5 指令的值 e.target.value Day4 表单组件封装 binding.value 和 e.target.valu…

plt函数显示图片 在图片上画边界框 边界框坐标转换

一.读取图片并显示图片 %matplotlib inline import torch from d2l import torch as d2l读取图片 image_path ../data/images/cat_dog_new.jpg # 创建画板 figure d2l.set_figsize() image d2l.plt.imread(image_path) d2l.plt.imshow(image);二.给出一个(x左上角,y左上角,…

使用Git把项目上传到Gitee的详细步骤

1.到Git官网下载并安装 2.到Gitee官网进行注册&#xff0c;然后在Gitee中新建一个远程仓库 3.设置远程仓库的参数 4.返回Gitee查看仓库是否生成成功 5.新建一个文件夹作为你的本地仓库 6.将新建好的文件夹初始化成本地仓库 第一步&#xff1a;右键点击刚创建的本地仓库&#…

小程序实现一个 倒计时组件

小程序实现一个 倒计时组件 需求背景 要做一个倒计时&#xff0c;可能是天级别&#xff0c;也可能是日级别&#xff0c;时级别&#xff0c;而且每个有效订单都要用&#xff0c;就做成组件了 效果图 需求分析 需要一个未来的时间戳&#xff0c;或者在服务度直接下发一个未来…