《Java程序员面试宝典》——(第三章节)

server/2024/10/18 18:39:24/

大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,经历过多次面试,有满意的也有备受打击的。
多次面试经历以及近期的面试真题来个汇总分析,说明下如何去准备,去回答面试官的提问,可以和面试官有个愉快的交谈。

1、Spring Boot 的核心特性有哪些?

1) 开箱即用,内嵌服务器。这个特点是程序员最直观的感 受,相较于原本的开发,spring boot 可以省略以前繁琐的 tomcat 配置,快速创建一个 web 容器。

2) SpringBoot通过自动配置功能,帮助开发者快速地配置和使用各种Spring组件。自动配置根据应用程序的依赖和配置文件,自动地为开发者创建和配置Bean。

3)SpringBoot提供了一套灵活的配置管理机制,使得开发者可以轻松地管理应用程序的配置信息。


2、简述 Springboot 优点 ?
1)独立运行
Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
2)简化配置
spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
3) 自动配置
Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring
boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。
4) 无代码生成和XML配置
Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x 的核心功能之一。

3、简述SpringBoot的核心注解 以及常用注解 ?

SpringBoot的核心注解包括‌

‌@SpringBootApplication‌:这是一个复合注解,用于标记应用的主类。它包含了以下三个注解:
‌@SpringBootConfiguration‌:等同于Spring的@Configuration,标明该类是配置类,并会把该类作为spring容器的源。
‌@EnableAutoConfiguration‌:启动自动配置,让Spring Boot根据类路径和定义的bean自动配置应用。
‌@ComponentScan‌:让Spring去扫描当前包及其子包下的类,并注册bean。

SpringBoot的常用注解包括‌

‌@RestController‌:与@Controller类似,但@RestController会自动将返回值转换为JSON格式。
‌@RequestMapping‌:用于映射请求URL和处理方法,可以用于类级别和方法级别,指定请求URL和HTTP方法(如GET、POST等)。
‌@Autowired‌:用于自动装配Spring容器中的Bean。
‌@Component‌:用于标识一个类是Spring容器中的组件。
‌@Service‌:用于标识一个类是Spring容器中的服务组件。
‌@Configuration‌:用于标识一个类是Spring的配置类。
‌@Bean‌:在配置类中定义一个方法,该方法返回一个对象,并将该对象注册为Spring容器中的Bean。
@PathVariable
路径变量,参数与大括号里的名字一样要相同;
@ConfigurationProperties
Spring Boot将尝试校验外部的配置,默认使用JSR-303(如果在classpath路径中)。你可以轻松的为你的@ConfigurationProperties 类添加JSR-303 javax.validation约束注解;
@Profiles
Spring Profiles 提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机;
@ControllerAdvice
包含@Component,可以被扫描到,统一处理异常;
@ExceptionHandler(Exception.class)
用在方法上面,表示遇到这个异常就执行以下方法;

4、SpringBoot 中如何实现定时任务 ?

在 Spring Boot 中实现定时任务非常直接,主要通过使用@Scheduled 注解的方式来实现,
单机不太经常变动的情况还是十分推荐使用 @Scheduled 注解。只需要在定时触发的方法上打上注解就可以了。

5、SpringBoot 默认同时可以处理的最大连接数是多少?
以Spring Boot 默认的容器 Tomcat 为例,从引入的 springboot-autoconfigure 依赖可以看出,Tomcat 默认的最大连接数是 8192 。

6、Spring Boot 2.x 与 1.x 版本有哪些主要的改进和区别?

1)构建基础不同‌:Spring Boot 2.x构建在Spring Framework 5.x之上,而1.x版本构建在Spring Framework 4.x之上。这一升级使得Spring Boot能够提供最新的Spring框架功能,并支持Java 8及更高版本‌。

‌2)响应式编程支持‌:2.x版本引入了响应式编程模型,通过整合Spring WebFlux和Reactor等项目,提供了对响应式编程的支持。这使得开发人员能够构建高性能、高吞吐量的应用程序,处理更多的并发请求,提供更好的性能和可伸缩性‌。

3)自动配置改进‌:2.x版本在自动配置方面进行了许多改进,引入了条件注解,可以根据一组条件来自动配置应用程序。这使得配置更加灵活和智能化‌。

‌4)其他改进和区别‌:

在拦截器方面,2.x中WebMvcConfigurerAdapter已被标记为过时,建议实现WebMvcConfigurer接口‌。
在注解方面,2.x中使用@ConfigurationProperties注解可以将配置文件中的属性读取至实体bean中,但使用prefix属性时不能使用驼峰命名方式‌。
在JPA方面,一些方法如findOne()应改为findById().get()实现,save()应改为saveAll()方法等‌。

7、Spring Boot 中的条件注解 @Conditional 有什么用?

‌@Conditional注解在Spring Boot中的作用是按照一定的条件进行判断,决定是否创建某个特定的Bean。‌ 这是一个条件装配注解,主要用于限制@Bean注解在什么时候才生效,即通过指定的条件形式控制Bean的创建。

@Conditional注解可以添加在被@Configuration、@Component、@Service等修饰的类,或在被@Bean修饰的方法上,用于控制类或方法对应的Bean是否需要创建。

使用@Conditional注解进行条件装配时,需要自定义类实现Condition接口,通过实现该接口来完成指定的条件判断。如果条件满足,则进行组件注入;如果不满足,则不进行注入。这种机制使得Spring Boot能够实现按需加载,提高了应用的灵活性和效率‌。

8、Spring Boot 中如何实现异步处理?

主要有四种方式来实现异步处理:
1)使用 @Async 注解
2)使用 CompletableFuture
3)使用 @Scheduled 注解
4)使用线程池

@Async 是 Spring 提供的注解,用于指定某个方法在另一个线程中异步执行。
只要在配置类上添加 @EnableAsync 注解,然后在需要异步执行的方法上添加 @Async 注解即可实现。
9、Spring Boot 中application.properties 和application.yml 的区别是什么?

它们两者的区别就在于书写格式,对配置而言效果是一样的,就是个人偏好问题。
application.properties 使用键值对配置,键和值之间用等号或冒号分隔
application.yml 使用 YAML (YAML Ain't Markup Language)格式,具有层级结构,使用缩进表示嵌套关系。适合复杂配置,阅读性更佳。

10、@SpringBootApplication 注解的作用是什么?
包含了以下三个核心部分 ‌@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
‌@SpringBootApplication注解是Spring Boot应用程序的核心注解,它简化了Spring应用程序的配置和启动过程。‌ 这个注解是一个复合注解,包含了多个其他Spring框架中的注解,主要用于Spring Boot应用的主类上,以快速启动并配置应用。

11、如何在 SpringBoot 启动时执行特定代码?
实现 CommandLineRunner 接口
CommandLineRunner 接口用于在 Spring Boot 应用启动完成后,执行特定的代码逻辑。可以有多个实现类,按照@Order 注解的顺序执行。

12、Spring Boot 是如何通过 main 方法启动 web 项目的?

Spring Boot 应用的启动流程都封装在SpringApplication.run 方法中,它的大部分逻辑都是复用Spring 启动的流程,只不过在它的基础上做了大量的扩展。
在启动的过程中有一个刷新上下文的动作,这个方法内会触发 webServer 的创建,此时就会创建并启动内嵌的 web 服务,默认的 web 服务就是 tomcat。

13、Spring Boot 如何处理跨域请求 (CORS)?

在Spring Boot中处理跨域请求,可以通过实现一个WebMvcConfigurer接口的配置类,并覆盖addCorsMappings方法来设置跨域资源共享(CORS)的规则。

也可以使用

  • 使用 @CrossOrigin 注解实现跨域;

14、Spring 有哪些主要模块?

Spring 由七大模块组成,分别是Spring 核心容器(Spring Core)、应用上下文(Spring Context)、Spring面向切面编程(Spring AOP)、JDBC和DAO模块(Spring DAO)、对象实体映射(Spring ORM)、Web模块(Spring Web)以及MVC模块(SpringWebMVC)。

15、什么是循环依赖(比较常问)?
 循环依赖(Circular Dependency)是指两个或多个模块、类、组件之间相互依赖,形成一个闭环。简而言之,模块A依赖于模块B,而模块B又依赖于模块A,这会导致依赖链的循环,无法确定加载或初始化的顺序。

16、Spring 一共有几种注入方式?
‌1)构造器注入(Constructor Injection)‌:通过类的构造函数来注入依赖项。在类的构造函数中传入依赖项的实例。这种方式确保了依赖项在对象创建时就可用,且不可变‌。

‌2)Setter方法注入(Setter Injection)‌:通过类的setter方法来注入依赖项。在类中定义setter方法,然后在配置文件中设置依赖项的实例。这种方式可以在对象创建后再设置依赖项,灵活性较高‌。

3)注解注入(Annotation Injection)‌:通过使用注解如@Autowired、@Resource等来标记需要注入的属性或构造方法,从而实现依赖注入。这种方式是Spring中最常用的注入方式之一‌。

17、什么是 AOP?
AOP,Aspect Oriented Programming,面向切面编程。将一些通用的逻辑集中实现,然后通过 AOP 进行逻辑的切入,减少了零散的碎片化代码,提高了系统的可维护性。
具体是含义可以理解为:通过代理的方式,在调用想要的对象方法时候,进行拦截处理,执行切入的逻辑,然后再调用真正的方法实现。

18、Spring Bean 一共有几种作用域?
1)singleton(单例模式)

2)prototype(原型模式)

3)request、session、application、websocket作用域

19、Spring中Bean的作用域默认是什么?
‌Spring中Bean的默认作用域是singleton。‌ 当定义Bean时,如果没有指定作用域配置项,则Bean的作用域默认为singleton。这意味着Spring IoC容器中只会存在一个共享的Bean实例,所有对Bean的请求,只要id与该Bean定义相匹配,就会返回同一个实例。

20、说下 Spring Bean 的生命周期?

1)实例化: Spring容器通过反射或者工厂方法创建Bean的实例。

2)属性赋值: 为Bean的属性设置值和对其他Bean的引用。

3)初始化(Initialization): 如果Bean实现了InitializingBean接口,其afterPropertiesSet()方法会被调用;或者,如果Bean使用init-method属性声明了初始化方法,这个方法也会被调用。

4)使用: Bean现在可以被应用程序使用了。

5)销毁: 当容器关闭时,如果Bean实现了DisposableBean接口,其destroy()方法会被调用;或者,如果Bean使用destroy-method属性声明了销毁方法,这个方法也会被调用。
 

21、‌你了解的 Spring 都用到哪些设计模式?

工厂模式,从名字就看出来了 BeanFacotry,整个 Spring IOC 就是一个工厂。
模板方法模式,例如 JdbcTemplate、RestTemplate 名字是xxxTemplate 的都是模板。
代理模式,AOP 整的都是代理。
单例模式,默认 bean 都是单例的。
观察者模式,Spring里的监听器。


http://www.ppmy.cn/server/132831.html

相关文章

C#学习笔记(三)

C#学习笔记(三) 第 二 章 命名空间和类、数据类型、变量和代码规范二、类的组成和使用分析1. 基本概念2. 类的内容组成3. 方法的初步理解 第 二 章 命名空间和类、数据类型、变量和代码规范 二、类的组成和使用分析 1. 基本概念 类是程序的基本单元&a…

大数据治理:构建新时代数据生态的关键

摘要 随着信息技术的飞速发展和数字化浪潮的席卷,大数据已成为当今社会的核心资源。如何有效治理大数据,不仅关系到数据资源的利用效率,还对隐私保护、网络安全和社会秩序产生深远影响。本文深入探讨了大数据治理的概念、面临的挑战以及治理框架的构建,从技术、法律和伦理等…

Redis JSON数据结构详解及Java实现

Redis不仅是一个高性能的键值存储数据库,还提供了丰富的数据结构支持,其中包括RedisJSON模块。RedisJSON允许用户以JSON格式存储和操作数据,使得Redis不仅适用于简单的键值对存储,还能处理复杂的嵌套数据结构。本文将介绍如何使用…

开源OpenStack

1.查询HCS基于OpenStack哪个版本开发 2.九大核心组件 OpenStack可以对接FC也可以对接KVM主机;(OpenStack 对接华为FusionCompute,一个集群对应 openstack 一台计算主机)-引申出nova compute 2.1nova nova两个核心组件nova contro…

滚雪球学Redis[7.3讲]:Redis在排行榜系统中的应用:高效构建与优化

全文目录: 🎉前言🚦Redis排行榜的使用场景🍂典型使用场景 📈使用Sorted Set实现排行榜🦖1. 添加或更新排行榜元素🐲2. 获取排行榜🐉3. 获取玩家排名🦕4. 删除元素 ⚙️动…

原理代码解读:基于DiT结构视频生成模型的ControlNet

Diffusion Models视频生成-博客汇总 前言:相比于基于UNet结构的视频生成模型,DiT结构的模型最大的劣势在于生态不够完善,配套的ControlNet、IP-Adapter等开源权重不多,导致难以落地。最近DiT-based 5B的ControlNet开源了,相比于传统的ControlNet有不少改进点,这篇博客将从…

Springboot 整合 Java DL4J 实现物流仓库货物分类

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

标题:民锋金融:智能投资平台引领财富管理新时代

随着全球金融市场的快速发展,投资者面临的挑战和机遇日益增多。在这样的背景下,民锋金融通过科技赋能,打造了一个智能化的全球投资平台,致力于为客户提供多元化的资产配置和创新的投资解决方案,帮助他们实现财富稳步增…