一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是面试题,也是你 Java 知识点的扫盲贴。
回答在SpringBoot3中,spring.factories文件被移除,主要是为了引入更灵活和模块化的自动配置机制。在之前的版本中,spring.factories文件用于定义自动配置类,但这种方式存在一些局限性,例如难以管理和扩展。为了解决这些问题,SpringBoot3引入了新的配置方式,即在类路径下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,列出需要自动配置的类的全限定名,每行一个。这种方式提高了配置的可读性和可维护性,使得自动配置过程更加清晰和灵活。详情spring.factories的局限性在SpringBoot的早期版本中,我们一般都是使用META-INF/spring.factories来自定义我们的自动配置类,格式如下:org.springfra
回答在SpringBoot中定义一个starter主要包括如下几个步骤:创建一个项目:创建一个独立的Maven或者Gradle项目,作为Starter的基本框架,并添加spring-boot-autoconfigure依赖编写自动配置类:编写一个自动配置类,这个类通过@Configuration注解来封装你要自动装配的Bean。配置spring.factories文件:在src/main/resources/META-INF目录下创建spring.factories文件,声明需要自动装配的配置类。关于是使用spring.factories还是spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,参考面试题:为什么SpringBoot3中移除了spring.factories发布starter:将自定义
回答SpringBoot应用的优雅停机是为了应用在关闭时,能够合理地释放资源,完成一些必要的清理工作,并保证不影响正在处理的请求。要实现SpringBoot的优雅停机,可以有如下几种方式:启用SpringBoot的GracefulShutdown功能在SpringBoot2.3+中,它内置了优雅停机支持只需在application.properties启用即可,参数配置:server.shutdown=graceful。定义@PreDestroy或实现DisposableBean接口如果我们要执行一些清理逻辑,比如关闭数据库连接池,释放缓存等等,则可以使用@PreDestroy或者实现DisposableBean接口。使用ApplicationListener监听上下文关闭事件我们也可以使用ApplicationListener来监听ContextClosedEvent事件来实现我们的清理
回答SpringBoot的jar之所以可以直接运行,主要是因为它是一个可执行的Jar(FatJar),并且内部集成了一个嵌入式的Servlet容器(比如Tomcat、Jetty或Undertow)。这种方式可以直接通过java-jar命令运行,而无需单独部署到外部应用服务器中。这种运行机制的核心在于SpringBoot使用了一个特殊的启动类org.springframework.boot.loader.JarLauncher,以及自定义的类加载机制。简单点说就是:SpringBoot将所有的依赖和资源打包到一个单独的Jar文件中。使用JarLauncher类管理启动流程,内部就是通过反射机制执行我们的main()。提供嵌入式容器,让应用直接运行。详解可执行的jarSpringBoot提供了一个名叫spring-boot-maven-plugin的maven项目打包插件,如下:<plu
回答SpringBoot的main()是整个SpringBoot项目的启动入口。它通过SpringApplication.run()完成了整个项目的启动过程,最终让一个Web项目运行起来。SpringBoot的启动过程分为以下几个主要步骤:初始化SpringApplication:SpringApplication类在启动时会做一些配置工作,比如确定项目是否是Web应用。准备环境:SpringBoot会加载运行时环境,比如系统属性、环境变量等,最终形成一个Environment对象。创建并刷新Spring容器:加载所有的Bean定义,并完成Bean的初始化工作。启动嵌入式Web容器:如果是Web项目,它会启动内嵌的Tomcat、Jetty等Web服务器。运行应用程序:执行用户自定义的逻辑,比如@SpringBootApplication中的CommandLineRunner或Applica
回答SpringBoot的自动配置核心是基于条件化配置来实现的。通过注解@EnableAutoConfiguration,SpringBoot可以扫描并加载相关的自动配置类,这些类会根据当前上下文中的条件来决定是否生效。核心机制是通过条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean)配合META-INF/spring.factories文件中的配置,完成Bean的动态加载。简单来说,就是通过查看当前环境和依赖的情况,动态地为应用配置必要的Bean,而不需要手动去定义。打个比方,就是说SpringBoot的自动配置就像一个智能助手,能根据我们给出的提示(比如引入的依赖或者设置的配置)自动完成大部分繁琐的配置工作,这极大地提升了我们的开发效率。详解SpringBoot是如何实现自动装配机制的我们先看SpringBoot的核心注解@Sprin
回答在一些场景下,控制Bean的加载顺序通常是为了确保某些依赖关系或者配置能够在其他组件初始化之前完成,比较常用的方式有两种:使用@DependsOn:指定某个Bean依赖于其他Bean,确保被依赖的Bean会优先加载。实现Ordered接口或使用@Order注解:控制Bean的初始化顺序。在实际应用中,我们一般推荐使用@DependsOn来显示指定Bean的加载顺序。详解使用@DependsOn@DependsOn用于声明一个Bean需要依赖另一个Bean的加载顺序,被依赖的Bean会先加载。例如:@Component@DependsOn("Skjava2Service")publicclassSkjava1Service{}@ComponentpublicclassSkjava2Service{}这里会优先初始化Skjava2Service。使用@DependsOn
回答跨域问题是一个前端和后端的通信问题,发生在浏览器窒息感同源策略时,限制了前端网页向其域名、协议、端口不同的服务器发生请求。比如前端的页面运行在http://localhost:3000,而后端服务运行在http://localhost:8080,这种情况下的请求就会触发跨域问题。SpringBoot提供了三种方式来解决跨域问题:使用@CrossOrigin注解:适用于单个控制器或方法,指定允许跨域的来源。全局配置CORS:通过实现WebMvcConfigurer接口的addCorsMappings方法,进行全局跨域配置。配置过滤器:自定义一个跨域过滤器,添加所需的CORS头。详解什么是跨域问题跨域是指浏览器的同源策略限制了网页向其他域发送请求的行为。同源策略要求协议、域名、端口号必须一致。例如:http://skjava.com:80和https://``skjava``.com:80
回答“约定大于配置”是SpringBoot的核心理念之一,目的是简化开发过程,减少我们在配置上的繁琐工作。具体来说,就是SpringBoot通过一系列的默认设置和约定,减少了我们需要显式配置的内容,从而让我们专注于业务逻辑,而不必过多关注框架的配置细节。它主要从以下几个方面体现:默认配置:SpringBoot提供了大量的默认配置,一些常见的框架,如MySQL、redis、JPA等等,我们可以在不做任何额外配置的情况下就可以自动工作。自动化配置:SpringBoot可以通过@EnableAutoConfiguration注解和大量的自动配置类(@Configuration)来自动根据项目的类路径和环境来选择合适的配置。例如,当SpringBoot检测到我们使用了H2数据库,它会自动配置一个内存数据库的连接。外部化配置:通过application.properties或application.