spring常见面试题(2023最新)
目录
- 前言
- 1.spring是什么
- 2.spring的设计核心是什么
- 3.IOC和AOP面试题
- 4.spring的优点和缺点
- 5.spring中bean的作用域
- 6.spring中bean的注入方式
- 7.BeanFactory 和 ApplicationContext有什么区别?
- 8.循环依赖的情况,怎么解决?
- 9.spring中单例Bean是线程安全的吗?
- 10.spring如何处理线程的并发问题?
- 11.spring中bean的生命周期
- 12.spring Bean的扩展点
- 13.在 Spring中如何注入一个java集合?
- 14.bean的自动装配
- 15.spring用到了那些设计模式
- 16.spring的常用注解
- 17.spring 事务实现方式有哪些?
- 18.spring事务的实现方式和实现原理
- 19.说一下 spring 的事务隔离?
- 20.spring事务的传播行为
前言
java最新面试题(java基础、集合、多线程、jvm、锁、算法、CAS、Redis、数据库、mybatis、spring、springMVC、springBoot、微服务)
1.spring是什么
轻量级开发框架,为java提供了基础架构支持,简化了企业级应用开发,让开发者只需要关注业务逻辑。
2.spring的设计核心是什么
IOC和AOP
3.IOC和AOP面试题
谈谈你对IOC和AOP的理解
4.spring的优点和缺点
优点:
①解耦和方便开发:spring容器进行对象的创建和管理。
②AOP的支持:面向切面编程,实现日志和权限拦截等功能。
③声明事务的支持:通过配置进行事务管理,不需要手动编写。
④方便集成各种框架。
缺点:
①使用大量反射机制,占内存,不如直接调用效率高。
②没有做到依赖管理。
③集成的框架耦合度高,不易拆分。
5.spring中bean的作用域
①singleton(单例模式): 默认作用域,在spring容器中一个bean只创建一个实例,所有对bean的请求和引用都会返回这个实例。适用都是无状态的bean。
②prototype(原型模式): 每次请求都会为bean创建一个实例。适用都是有状态的bean。
③request(请求作用域): 为每一个HTTP请求创建一个实例,在请求完成以后,bean会失效,会被垃圾回收器回收。
④session(会话作用域): 为每一个HTTP会话创建一个实例,不同会话使用不同实例,session销毁,bean失效。
⑤global-session(全局作用域): Spring5 已经没有了。
有状态: 有数据存储功能。
无状态: 不会保存数据。
6.spring中bean的注入方式
①构造器注入
②Setter注入
③接口注入(灵活性和易用性差,Spring4已经废弃)
7.BeanFactory 和 ApplicationContext有什么区别?
是spring的核心接口,都可以作为容器,ApplicationContext是BeanFactory的子接口。
BeanFactory: 是spring最底层的接口,包含各种Bean的定义和Bean的管理。
ApplicationContext: 作为BeanFactory的派生,除了有BeanFactory的功能以外,还提供了更多的功能。
区别:
① BeanFactroy采用的是延迟加载形式来注入Bean的,使用到bean才会加载。ApplicationContext一次性加载所有bean。
② BeanFactory需要手动注册,而ApplicationContext则是自动注册。
③ BeanFactory不支持国际化,ApplicationContext支持国际化(实现MessageSource接口)。
8.循环依赖的情况,怎么解决?
循环依赖:A依赖B,B依赖C,C依赖A,形成了闭环。
①构造器的循环依赖: 这种依赖spring是处理不了的,直接抛出异常。
②单例模式下的setter循环依赖: 通过"三级缓存"处理循环依赖,能处理。
③多例模式下的setter循环依赖: 不能处理,会一直产生新的Bean,导致OOM。
9.spring中单例Bean是线程安全的吗?
不是,因为所有线程共享一个单例Bean,存在资源的竞争所以是线程不安全的,实际上大部分时间Bean是无状态的,所以说在某种程度上来说Bean其实是安全的。如果是有状态,那就需要开发人员修改bean的作用域。singleton改为prototype。
有状态: 有数据存储功能。
无状态: 不会保存数据。
10.spring如何处理线程的并发问题?
①把成员变量写在方法内。
②使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。
③修改bean的作用域,singleton改为prototype。(@Scope(“prototype”))
④使用synchronized修饰。
11.spring中bean的生命周期
bean: 是由 Spring IoC 容器实例化、组装和管理的对象。
正常情况: 当bean不在被使用,就会被回收。
单例模式: spring中bean的生命周期分为:实例化Bean->Bean属性填充->初始化Bean->销毁Bean。
多例模式: spring无法进行管理,所以将生命周期交给用户控制。
12.spring Bean的扩展点
1.专用拓展点:用于单个 Bean 的扩展,定义 Bean 类时实现接口来扩展功能
(1) Aware 接口及子接口:属性填充的时候注入 Bean 信息或上下文等信息
使用 BeanNameAware接口 将当前 Bean 的名称注入到类中
public class Xinxin implements BeanNameAware {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name;}
}
(2) InitializingBean 和 DisposableBean 接口
InitializingBean:在 Bean 初始化时添加自定义逻辑
DisposableBean :在 Bean 销毁时添加自定义逻辑
public class Xinxin implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() {// do some initialization work}@Overridepublic void destroy() {// do some destruction work}
}
(3) 使用@Bean
注解在Bean初始化时和Bean销毁时自定义逻辑
public class Xinxin{public void init() {// do some initialization work}public void destroy() {// do some destruction work}
}@Configuration
public class AppConfig {//initMethod 属性指定 Bean 初始化方法,destroyMethod 属性指定 Bean 销毁方法。@Bean(initMethod = "init", destroyMethod = "destroy")public Xinxin xinxin() {return new Xinxin();}
}
(4) 使用注解@PostConstruct
(修饰的方法为Bean初始化时执行的方法)和@PreDestroy
(修饰的方法为Bean销毁时执行的方法)
public class Xinxin{@PostConstructpublic void init() {// do some initialization work}@PreDestroypublic void destroy() {// do some destruction work}
}
2. 通用扩展点:用于所有 Bean 的扩展,单独定义类实现接口来扩展功能
(1) BeanPostProcessor 接口:实现该接口可以在 Bean 初始化前后添加自定义逻辑。
@Component
public class XinxinInitProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// before initialization workreturn bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// after initialization workreturn bean;}
}
(2)InstantiationAwareBeanPostProcessor 接口:实现该接口可以在 Bean 实例化前后添加自定义逻辑。
@Component
public class XinxinInstanceProcessor implements InstantiationAwareBeanPostProcessor {@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {// before instantiation workreturn null;}@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {// after instantiation workreturn true;}
}
(3) DestructionAwareBeanPostProcessor 接口:实现该接口可以在 Bean 销毁前添加自定义逻辑。
@Component
public class BeanDestroyProcessor implements DestructionAwareBeanPostProcessor {@Overridepublic void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {// before destruction work}
}
13.在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素:
想要注入java集合,就是注入集合类。
list: 类型用于注入一列值,允许有相同的值。
set: 类型用于注入一组值,不允许有相同的值。
map: 类型用于注入一组键值对,键和值都可以为任意类型。
props: 类型用于注入一组键值对,键和值都只能为String类型。
14.bean的自动装配
spring会在上下文中自动寻找,并自动给bean装配属性。之前属性需要我们手动注入。
15.spring用到了那些设计模式
工厂模式: beanFactory就用到了简单工厂模式。
单例模式: Bean默认为单例模式。
代理模式: AOP用到了JDK的动态代理模式。
模板模式: 减少代码冗余,Jdbc模板等。
观察者模式: 定义对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。spring监听器的实现就用了观察者模式。
16.spring的常用注解
@Component(任何层)、@Controller(表现层)、@Service(逻辑层)、@Repository(持久层): 被修饰的类,会被spring扫描到并注入到bean容器中(实例化对象)。
@Scope: 设置spring的作用域。
@Bean: 用于将方法返回值对象放入容器。
@Import: 在一个配置类中导入其它配置类的内容。
@AutoWired: 按照类型匹配注入。
@Qualifier: 和AutoWired联合使用,在按照类型匹配的基础上,在按照名称匹配。
@Resource: 按照名称匹配依赖注入。
@Configuration: 被此注解标注的类,会被 Spring 认为是配置类。
@ComponentScan: 用于对组件(Component)进行扫描。
@Transactional: 可以用于类和方法上,具有事务管理的功能
@Value: 将外部的值动态注入到 Bean 中。
@Value(“${}”):可以获取配置文件的值。
@Value(“#{}”):表示SpEl(Spring Expression Language是Spring表达式语言,可以在运行时查询和操作数据。)表达式通常用来获取 bean 的属性,或者调用 bean 的某个方法。
17.spring 事务实现方式有哪些?
编程式: beginTransaction()、commit()、rollback()等事务管理相关的方法,灵活度高,但是维护性差。
声明式: 利用注解或者xml配置,将业务和事务分离出来。
18.spring事务的实现方式和实现原理
spring事务就是对数据库事务的支持,没有数据库的事务支持,spring是无法提供事务
功能的。
19.说一下 spring 的事务隔离?
五大隔离级别。
ISOLATION_DEFAULT: 默认值,使用数据库的隔离级别。
ISOLATION_READ_UNCOMMITTED: 读未提交。
ISOLATION_READ_COMMITTED: 读已提交。
ISOLATION_REPEATABLE_READ: 可重复读。
ISOLATION_SERIALIZABLE: 序列化。
20.spring事务的传播行为
REQUIRED(默认):
默认事务传播行为,存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
REQUIRE_NEW:
它不管是否存在事务,它都会新开启一个事务来执行,新老事务相互独立的,外部事务抛出异常,并不会影响内部事务的一个正常提交。
NESTED:
如果当前存在事务,就嵌套当前事务中去执行,如果当前没有事务,那么就新建一个事务,类似 REQUIRE_NEW这个样一个传播行为。
SUPPORTS:
表示支持当前当前的事务,如果当前不存在事务,就以非事务的方式去执行。
NOT_SUPPORT:
总是非事务地执行,并挂起任何存在的事务。
MANDATORY:
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
NEVER:
就是以非事务的方式来执行,如果存在事务则抛出一个异常。
spring常见面试题(2023最新)相关推荐
- SpringMVC常见面试题(2023最新)
目录 前言 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常 ...
- Spring常见面试题及答案汇总1000道(春招+秋招+社招)
Spring面试题以及答案整理[最新版]Spring高级面试题大全(2021版),发现网上很多Spring面试题都没有答案,所以花了很长时间搜集,本套Spring面试题大全,汇总了大量经典的Sprin ...
- Spring常见面试题总结
这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码! 下面的很多问题我自己在使用 Spring 的过程中也并没有注意,自己也是临时查阅了很多资料和书籍补上的.网上 ...
- MySQL常见面试题(2023年最新)
目录 前言 1.char和varchar的区别 2.数据库的三大范式 3.你了解sql的执行顺序吗? 4.索引是什么 5.索引的优点和缺点 6.索引的类型 7.索引怎么设计(优化) 8.怎么避免索引失 ...
- Spring常见面试题55道(附答案2023最新版)
1.什么是 Spring 框架,它的优点是什么?它的主要功能是什么? Spring 框架是一个开源的 Java 框架,主要用于开发企业级 Java 应用程序.它提供了一组强大的功能和工具,使得开发者能 ...
- Spring常见面试题(13个面试题,回答超详细)
马上开春了面试前必备技能啊,就算不背下来也得知道一些.免得尴尬. 目录 面试题一:Spring是什么? 面试题二:说说Spring 的优点? 面试题三:谈谈你对Spring的IOC理解? 面试题四:说 ...
- Spring学习(十)Spring常见面试题汇总
本文借鉴:Spring框架总结,Spring容器中Bean的生命周期,69道Spring面试题和答案 一.前言 此篇文章一是为了整合一下常见的面试题,二也是为了简单的归纳一些常见的知识点,萌新刚上路, ...
- Spring常见面试题
更多面试题请狠狠的点击 下载 这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的.下次你再也不用担心你的面试了,Java Code Geeks这就帮你解答 ...
- 2020 - [Java基础 +多线程 + 虚拟机] + [计网 + 操作系统] + [MySQL] + [Redis] + [RocketMQ] + [Spring]常见面试题与解析
前情提要:下面的内容主要由网上的资料和个人的理解整理而成.由于时间仓促可能没有给出相应的链接,并不代表我不尊重他人的劳动成果,后续更新会补上相应的链接.其中内容可能有理解不到位的地方,大家可选择性采纳 ...
最新文章
- py文件打包或apk_Python文件打包成exe很简单,如果安卓手机也能运行的软件你会吗...
- 科大星云诗社动态20210330
- boost::contract模块实现ifdef宏功能测试程序
- Html----编写
- MacOs桌面自动被打乱的原因
- String、StringBuilder、StringBuffer的区别
- 终于有人把可解释机器学习讲明白了
- GMF 教程 Mindmap 6
- Druid:数据库连接池实现技术,由阿里巴巴提供的
- 【数学、dp】bigcoin 2013广东省赛E题
- gitlab一键安装 笔记
- C语言小游戏——扫雷
- 有哪些不错的查文献或查资料的网站或APP?
- 只需4步,微软数据科学家教你用OpenRefine搞定数据清洗
- python正弦波叠加方波_电赛初探(一)——正弦波、方波、锯齿波转换
- Netd 服务的 netd 套接字创建
- C - Alphabetic Removals
- 征途服务器修改,征途【改版教程】-装备程序的修改-转载于-喜欢玩网游单机站...
- uiautomatorviewer Error obtaining UI hierarchy
- 梦泪的服务器是qq还是微信,梦泪发现微信区1奇特现象,赛季末分数远不如QQ区,看到1细节,懂了...