大多 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里的监听器。