01---java面试八股文——springboot---10题
01-你是怎么理解Spring Boot 的约定优于配置
- 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。
- Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架下的一个脚手架,通过Spring Boot,我们可以快速开发基于 Spring 生态下的应用程序。
- 基于传统的Spring框架开发web应用,我们需要做很多和业务开发无关并且只需要做一次的配置:
- 管理 jar 包依赖
- web.xml 维护
- Dispatch-Servlet.xml 配置项维护
- 应用部署到 Web 容器
- 第三方组件集成到 Spring IOC 容器中的配置项维护
- 而在 Spring Boot 中,我们不需要再去做这些繁琐的配置,Spring Boot 已经自动帮我们完成了,这就是约定优于配置思想的体现。
- Spring Boot 约定优于配置的体现有很多:
- Spring Boot Starter 启动依赖,它能帮我们管理所有 jar 包版本
- 如果当前应用依赖了 spring mvc 相关的 jar,那么 Spring Boot 会自动内置Tomcat 容器来运行 web 应用,我们不需要再去单独做应用部署。
- Spring Boot 的自动装配机制的实现中,通过扫描约定路径下的spring.factories 文件来识别配置类,实现 Bean 的自动装配。
- 默认加载的配置文件 application.properties 等等。
- 总的来说,约定优于配置是一个比较常见的软件设计思想,它的核心本质都是为了更高效以及更便捷地实现软件系统的开发和维护。
02-聊一下Spring Boot 中自动装配机制的原理
- 自动装配,简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 器里面,不需要开发人员再去写 Bean 的装配配置。
- 在 Spring Boot 应用里面,只需要在启动类加上
@SpringBootApplication 注解
就可以实现自动装配。@SpringBootApplication 是一个复合注解,真正实现自动装配的注解是@EnableAutoConfiguration。 - 自动装配的实现主要依靠三个核心关键技术。
-
- 引入 Starter 启动依赖组件的时候,这个组件里面必须包含
@Configuration 配置类
,在这个配置类里面通过@Bean 注解声明需要装配到 IOC 容器的 Bean 对象。
- 引入 Starter 启动依赖组件的时候,这个组件里面必须包含
-
- 这个配置类是放在第三方的 jar 包里面,然后通过 SpringBoot 中的约定优于配置思想,把这个配置类的全路径放在 classpath:META-INF/spring.factories 文件中。这样SpringBoot 就可以知道第三方 jar 包里面的配置类的位置,这个步骤主要是用到了 Spring 里面的SpringFactoriesLoader来完成的。
-
- SpringBoot 拿到第三方 jar 包里面声明的配置类以后,再通过 Spring 提供的ImportSelector接口,实现对这些配置类的动态加载。
-
- 在我看来,SpringBoot 是约定优于配置这一理念下的产物,所以在很多的地方,都会看到这类的思想。它的出现,让开发人员更加聚焦在了业务代码的编写上,而不需要去关心和业务无关的配置。其实,自动装配的思想,在 SpringFramework3.x 版本里面的@Enable 注解,就有了实现的雏形。@Enable 注解是模块驱动的意思,我们只需要增加某个@Enable 注解,就自动打开某个功能,而不需要针对这个功能去做 Bean 的配置,@Enable 底层也是帮我们去自动完成这个模块相关Bean的注入。
03-谈谈你对springboot的理解
- Spring Boot 是一个功能强大且易于使用的框架,它极大地简化了 Spring 应用的开发和部署过程。通过提供默认配置、自动装配、内嵌 Servlet 容器等功能,Spring Boot 使得开发者能够更快地启动和运行应用,并专注于业务逻辑的实现。同时,Spring Boot 还提供了丰富的生态系统和监控管理工具,以及高度的灵活性和可扩展性,使得开发者能够轻松地构建现代化、高性能的应用程序。
04-为什么要使用Springboot
-
快速开发:Spring Boot 通过提供大量的默认配置和自动装配功能,极大地减少了开发者需要编写的配置代码。这意味着开发者可以更快地启动项目,专注于业务逻辑的实现,而不是在配置和集成上花费大量时间
-
简化配置:
- starter:可以减少依赖的配置,一个starter里面就包含了若干个依赖
- parent:减少依赖冲突,parent里面已经定义好对应的依赖管理,使用parent管理的依赖的时候无需自定义依赖的版本
-
能够独立运行:Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器 中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个jar包内
-
一站式解决方案:Spring Boot 与 Spring 框架中的其他项目(如 Spring MVC、Spring Data JPA、Spring Security 等)无缝集成,为开发者提供了一站式的解决方案。这意味着可以使用 Spring Boot 来构建完整的应用程序,而无需担心不同组件之间的兼容性和集成问题。
-
丰富的生态系统:Spring Boot 拥有丰富的第三方库和 Starter 项目,这些库和 Starter 项目提供了对常见功能和服务的支持。开发者可以通过添加相应的依赖来快速集成这些功能,而无需从头开始编写代码。
-
易于监控和管理:Spring Boot 提供了多种监控和管理工具,如 Spring Boot Actuator。通过 Actuator,开发者可以轻松地获取应用的运行信息,并进行远程管理。这使得应用的监控和管理变得更加容易和高效。
-
高度可扩展性:尽管 Spring Boot 提供了许多默认配置和自动装配功能,但它仍然保持了高度的可扩展性。开发者可以通过自定义配置、编写自定义的 Starter 等方式来扩展 Spring Boot 的功能,以满足特定的业务需求。
-
社区支持:Spring Boot 拥有庞大的社区支持和丰富的文档资源。这意味着开发者在遇到问题时,可以很容易地找到解决方案,并从社区中获得帮助。这降低了开发过程中的风险和不确定性。
-
现代化技术:Spring Boot 始终保持着与 Java 生态系统的同步更新,支持最新的 Java 版本和框架。这使得开发者能够使用最新的技术和工具来构建现代化的应用程序,从而保持竞争力。
-
易于部署:Spring Boot 应用可以打包成独立的可执行 JAR 文件,这使得它们更易于部署和管理。开发者可以将 JAR 文件直接部署到服务器或容器中,而无需进行复杂的配置和集成工作。
05-Springboot的核心注解是哪个?它主要由哪几个注解组成的?
- Springboot的核心注解是启动类上面的
@SpringBootApplication
注解,它是一个组合注解:它包含了@Configuration、@EnableAutoConfiguration 和 @ComponentScan
三个注解。- @SpringBootConfiguration:标识该类是 Spring Boot 应用程序的配置类,用于替代传统的 XML 配置文件。这个注解是 @Configuration 注解的特化,表明当前类是一个配置类,并用于定义 Spring 容器如何初始化、配置和管理 Bean。
- @EnableAutoConfiguration:自动配置注解,通过扫描 classpath 中的 jar 包,根据引入的依赖自动配置 Spring 框架。这个注解告诉 Spring Boot 根据添加的 jar 依赖为当前项目进行自动配置。例如,如果 classpath 下有 Spring MVC 的 jar 包,Spring Boot 会自动配置为 MVC 控制器。也可以关闭某个自动配置的选项,如关闭数 据 源 自 动 配 置 功 能 : @SpringBootApplication(exclude={ DataSourceAutoConfiguration.class })。
- @ComponentScan :自动扫描注解,用于自动扫描并注册组件(Bean),包括 @Controller、@Service、@Repository 和 @Configuration 等注解。这个注解默认会扫描与配置类相同的包及其子包下的所有 Bean,但可以通过指定包路径和过滤规则来进一步配置扫描行为
06-运行springboot有哪些方式
- 直接运行启动类:这是最直接的方式,通过集成开发环境(IDE)如 IntelliJ IDEA 或 Eclipse,你可以直接右键点击 Spring Boot 应用程序的启动类(即包含 main 方法的类),然后选择“Run”或“Debug”来运行应用程序。
- 使用 Maven 命令运行:在命令行中进入项目的根目录,然后执行 mvn spring-boot:run 命令来运行 Spring Boot 应用程序。这种方式依赖于 Maven 构建工具,并且需要项目中已经配置好 Spring Boot 插件。
- 打包成可执行的 JAR 文件运行:使用 Maven 或 Gradle 等构建工具,将 Spring Boot 应用程序打包成可执行的 JAR 文件。这通常通过执行 mvn package(Maven)或 gradle build(Gradle)命令来完成。打包完成后,你可以在命令行中使用 java -jar your-project.jar 命令来运行 JAR 文件。
- 打包成 WAR 文件并部署到 Servlet 容器运行(了解):如果需要将 Spring Boot 应用程序部署到外部的 Servlet 容器(如 Tomcat、Jetty 等),你可以将应用程序打包成 WAR 文件。这需要在项目的 pom.xml 文件中将打包方式设置为 WAR,并使用 Maven 或 Gradle 等构建工具执行打包命令。打包完成后,将生成的 WAR 文件部署到 Servlet 容器的 webapps 目录下,然后启动容器即可运行应用程序。
- 使用插件运行(了解):某些 IDE 或构建工具提供了专门的插件来运行 Spring Boot 应用程序。例如,在 IntelliJ IDEA 中,你可以安装 Spring Boot 插件,并通过该插件来运行和调试 Spring Boot 应用程序。
- 通过脚本运行(了解):对于一些自定义的运行需求,你可以编写脚本来启动 Spring Boot 应用程序。这些脚本可以包含设置环境变量、配置参数、启动服务等操作。
- 通过 Docker 容器运行:对于需要容器化部署的场景,你可以将 Spring Boot 应用程序打包成 Docker 镜像,并在 Docker 容器中运行。这种方式提供了更好的环境隔离和资源管理。
07-Springboot实现热部署有哪几种方式
- 使用 Spring Boot DevTools:Spring Boot DevTools 是 Spring Boot 官方提供的一个开发工具包,它支持自动重启、LiveReload 等功能,非常适合开发过程中的热部署需求。只需在项目的 pom.xml(Maven 项目)或 build.gradle(Gradle 项目)文件中添加 spring-boot-devtools 依赖,并在开发环境下启动应用程序。当代码或资源文件发生变化时,DevTools 会自动检测到这些变化,并重新启动应用程序,而无需手动重启。
- 使用Spring Loaded:Spring Loaded 是 Spring 官方早期提供的一款热部署工具,但目前已不再积极维护。尽管如此,它仍然可以在一些旧项目中使用。
使用 Spring Loaded 需要在项目的 pom.xml 文件中添加 Spring Loaded 依赖,并在启动应用程序时添加相应的 JVM 参数。 - IDE 的热部署功能:大多数流行的 IDE(如 IntelliJ IDEA、Eclipse、Spring Tool Suite 等)都提供了热部署功能,可以通过设置在不重启服务器的情况下重新加载更改。在 IntelliJ IDEA 中,可以通过设置自动编译和允许运行时编译来实现热部署。在 Eclipse 或 Spring Tool Suite 中,可以启用自动构建和自动发布功能。
08-Springboot的核心配置文件类型
有哪些,它们的加载顺序是咋样的?
-
springboot的核心配置文件类型有:
- application.properties
- application.yml
- application.yaml
-
不同的springboot核心配置文件的类型的加载顺序:
application.properties > application.yml > application.yaml
- 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
09-Springboot的核心配置有哪几个,它们的加载顺序是咋样的?
- springboot的核心配置文件有application 和 bootstrap 配置文件。
- 区别:
- 加载顺序与优先级
- 加载顺序:Spring Boot在启动时会
先加载bootstrap.yml
,然后才会加载application.yml。这意味着bootstrap.yml中的配置可以被用来配置Spring Boot的基础设置,例如日志和加密,这些设置需要在应用程序的其他部分甚至是application.yml之前生效。 - 优先级:如果在bootstrap.yml和application.yml中都定义了相同的属性,则bootstrap.yml中的属性将具有更高的优先级,并覆盖 application.yml中的属性。
- 加载顺序:Spring Boot在启动时会
- 配置内容与用途
- bootstrap.yml:用于系统级别的一些参数配置来引导程序执行,应用于更加早期的系统级别的配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。在Spring Cloud环境中,bootstrap.yml通常用于配置与Spring Cloud Config Server的连接,以及加解密配置等。
- application.yml:用于定义应用级别的应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。提供了简便的方式来配置Spring Boot应用程序的各种组件,如数据源、数据库、缓存、邮件服务等。如果搭配spring-cloud-config使用,application.yml里面定义的文件可以实现动态替换。
- 环境隔离与配置管理
- 环境隔离:application.yml文件支持不同环境的配置,开发者可以为开发环境、测试环境和生产环境创建不同的配置文件,如application-dev.yml、application-test.yml和application-prod.yml,并通过spring.profiles.active属性来指定当前激活的环境配置。bootstrap.yml通常不包含环境特定的配置,因为它是在应用程序启动的最早期阶段加载的。
- 配置管理:通过使用application.yml文件,开发者可以将应用程序的配置信息集中管理,方便维护和更新。bootstrap.yml虽然也可以用于配置管理,但由于其加载顺序和优先级的特殊性,它更适合用于配置那些需要在应用程序启动之前就已经确定的、不经常变动的系统级参数。
- 加载顺序与优先级
10-SpringBoot配置文件的分类
-
SpringBoot提供的4级配置文件分别是:
- 类路径下配置文件(一直使用的是这个,也就是resources目录中的application.yml文件):服务于开发人员本机开发与测试
- 类路径下config目录下配置文件:服务于项目经理整体调控
- 程序包(打包好的工程)所在目录中配置文件:服务于运维人员配置涉密线上环境
- 程序包(打包好的工程)所在目录中config目录下配置文件:服务于运维经理整体调控
-
4种配置文件如果都存在的话,有一个优先级的问题,4个文件的加载优先顺序为:
-
- file :config/application.yml 【最高】
-
- file :application.yml
-
- classpath:config/application.yml
-
- classpath:application.yml 【最低】
-
-
多层级配置文件间的属性采用叠加并覆盖的形式作用于程序