目录

  • 前言
  • 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最新)相关推荐

  1. SpringMVC常见面试题(2023最新)

    目录 前言 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常 ...

  2. Spring常见面试题及答案汇总1000道(春招+秋招+社招)

    Spring面试题以及答案整理[最新版]Spring高级面试题大全(2021版),发现网上很多Spring面试题都没有答案,所以花了很长时间搜集,本套Spring面试题大全,汇总了大量经典的Sprin ...

  3. Spring常见面试题总结

    这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码! 下面的很多问题我自己在使用 Spring 的过程中也并没有注意,自己也是临时查阅了很多资料和书籍补上的.网上 ...

  4. MySQL常见面试题(2023年最新)

    目录 前言 1.char和varchar的区别 2.数据库的三大范式 3.你了解sql的执行顺序吗? 4.索引是什么 5.索引的优点和缺点 6.索引的类型 7.索引怎么设计(优化) 8.怎么避免索引失 ...

  5. Spring常见面试题55道(附答案2023最新版)

    1.什么是 Spring 框架,它的优点是什么?它的主要功能是什么? Spring 框架是一个开源的 Java 框架,主要用于开发企业级 Java 应用程序.它提供了一组强大的功能和工具,使得开发者能 ...

  6. Spring常见面试题(13个面试题,回答超详细)

    马上开春了面试前必备技能啊,就算不背下来也得知道一些.免得尴尬. 目录 面试题一:Spring是什么? 面试题二:说说Spring 的优点? 面试题三:谈谈你对Spring的IOC理解? 面试题四:说 ...

  7. Spring学习(十)Spring常见面试题汇总

    本文借鉴:Spring框架总结,Spring容器中Bean的生命周期,69道Spring面试题和答案 一.前言 此篇文章一是为了整合一下常见的面试题,二也是为了简单的归纳一些常见的知识点,萌新刚上路, ...

  8. Spring常见面试题

    更多面试题请狠狠的点击 下载 这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的.下次你再也不用担心你的面试了,Java Code Geeks这就帮你解答 ...

  9. 2020 - [Java基础 +多线程 + 虚拟机] + [计网 + 操作系统] + [MySQL] + [Redis] + [RocketMQ] + [Spring]常见面试题与解析

    前情提要:下面的内容主要由网上的资料和个人的理解整理而成.由于时间仓促可能没有给出相应的链接,并不代表我不尊重他人的劳动成果,后续更新会补上相应的链接.其中内容可能有理解不到位的地方,大家可选择性采纳 ...

最新文章

  1. py文件打包或apk_Python文件打包成exe很简单,如果安卓手机也能运行的软件你会吗...
  2. 科大星云诗社动态20210330
  3. boost::contract模块实现ifdef宏功能测试程序
  4. Html----编写
  5. MacOs桌面自动被打乱的原因
  6. String、StringBuilder、StringBuffer的区别
  7. 终于有人把可解释机器学习讲明白了
  8. GMF 教程 Mindmap 6
  9. Druid:数据库连接池实现技术,由阿里巴巴提供的
  10. 【数学、dp】bigcoin 2013广东省赛E题
  11. gitlab一键安装 笔记
  12. C语言小游戏——扫雷
  13. 有哪些不错的查文献或查资料的网站或APP?
  14. 只需4步,微软数据科学家教你用OpenRefine搞定数据清洗
  15. python正弦波叠加方波_电赛初探(一)——正弦波、方波、锯齿波转换
  16. Netd 服务的 netd 套接字创建
  17. C - Alphabetic Removals
  18. 征途服务器修改,征途【改版教程】-装备程序的修改-转载于-喜欢玩网游单机站...
  19. uiautomatorviewer Error obtaining UI hierarchy
  20. 梦泪的服务器是qq还是微信,梦泪发现微信区1奇特现象,赛季末分数远不如QQ区,看到1细节,懂了...

热门文章

  1. (Mybatis)Example类用法example.createCriteria
  2. Robotium 介绍
  3. Vue解决跨域多个target问题(配置多个代理问题)
  4. 单片机——点阵2(Proteus和KeilC51)
  5. Python爬虫实例:爬取猫眼电影——破解字体反爬
  6. 了解Intel IPP
  7. SAR成像系列:【5】合成孔径雷达(SAR)成像算法-距离多普勒(RD)算法(附Matlab代码)
  8. 版本控制工具VSS使用介绍
  9. 规格模式 Specification Pattern
  10. 民营企业如何设置绩效考核指标的标准