springboot基础面试题

1. 加载配置文件的优先级

  1. bootstrap.properties或bootstrap.yml(这两个优先级最高)
  2. 内部的application.propertites application.yml
  3. implements EnvironmentPostProcessor and 重写postProcessEnvironment() ,并且在META-INF/spring.factories中启用我们的自定义环境处理类
    org.springframework.boot.env.EnvironmentPostProcessor=cn.huanzi.qch.springbootloadmyprofiles.MyEnvironmentPostProcessor
  4. 外部的配置文件 可以使用命令指定
  5. 命令行参数 修改某一个指定的参数
  6. 系统环境变量

2. Spring Boot 有哪几种读取配置文件中值的方式?

1、@Value 读取默认配置文件

@Value是 Spring框架提供的
  @Value 注解直接注入对应的值,这能获取到 Spring 中 Environment 的值;
可用于类的成员变量/方法参数/构造参数; 在使用@Value时, 需确保注入的属性值已经加载到容器中了 或者 要在Spring的生命周期中,否则无法注入成功.

适用场景

单个值的注入

失败场景

静态变量 (静态变量属于类属性,并不属于对象属性;而Spring是基于对象的属性进行依赖注入的。类在启动的过程中就被初始化了,而Bean此时还未被实例化)
final属性 (因为final属性只能通过构造方法注入,而@Value是在bean实例化之后才进行属性注入的)
非注册在Spring容器中的类
引用方式不对 (new方式引用而非Spring注解)

2 @ConfigurationProperties 注解把默认配置文件中对应的值绑定到一个JAVA对象;

3、直接获取注入 Environment 进行获取

Environment对象会在一个PropertySource对象集中进行搜索。

执行的搜索是分层进行的。默认情况下,系统属性优先于环境变量。因此,如果在调用env.getProperty("my-property")期间my-property属性恰好在两个地方都被设置,则系统属性值“胜出”并被返回。请注意,属性值不会合并,而是被前面的条目完全覆盖。
对于常见的StandardServletEnvironment,完整的层次结构如下所示,最高优先级的条目位于顶部

  1. ServletConfig 参数(如果适用——例如,在DispatcherServlet上下文中)
  2. ServletContext 参数(web.xml context-param 条目)
  3. JNDI 环境变量(java:comp/env/ 条目)
  4. JVM 系统属性(-D 命令行参数)
  5. JVM 系统环境(操作系统环境变量)

4 .读取指定文件

@PropertySource+@Value注解读取方式

资源目录下建立config/db-config.properties:
db.username=root
db.password=123456

总结:
配置属性的方式很多,Spring boot使用了一种独有的 PropertySource 可以很方便的覆盖属性的值。
PropertySource是对任何键值对源的简单抽象,Spring的StandardEnvironment配置了两个PropertySource对象——一个表示JVM系统属性集(System.getProperties()),另一个表示系统环境变量集(System.getenv())。

https://docs.springframework.org.cn/spring-framework/reference/core/beans/environment.html#beans-definition-profiles

5. @PropertySource

小结

3. SpringBoot的 Actuator 是做什么的?

开关到底有没有用呢

4. 如何理解spring.factories文件的作用?

spring.factories, 用于实现在类路径下自动发现和加载扩展点的功能。类似于Java中SPI(Service Provider Interface)机制,提供了一种可以供第三方注册实现自己的接口,然后达到插拔式扩展的目的。

  1. 插拔点的发现
    Spring框架会在类路径下搜索并加载spring.factories文件,文件中所有的内容就是具体的插拔点。
  2. 解耦和可插拔性(加新功能)
    spring.factories的作用类似于插件机制,通过spring.factories文件中的自定义的实现类,把自定义的功能集成Spring现有的默认实现,这样不需要显式的修改Spring源码。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\ com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
3. 实现框架定制(修改原有Spring功能)
场景需求:实现
implements EnvironmentPostProcessor and 重写postProcessEnvironment() ,并且在META-INF/spring.factories中启用我们的自定义环境处理类

org.springframework.boot.env.EnvironmentPostProcessor=cn.huanzi.qch.springbootloadmyprofiles.MyEnvironmentPostProcessor

  1. 多模块项目的扩展
    如果是多模块项目,每一个项目中都有自己的spring.factories文件。这样每个模块都可以实现注册自己的扩展点,实现模块之间的松耦合和灵活性。

5. springboot默认可以处理多少请求呢

6. 如何对SpringBoot配置文件进行加解密?

7. SpringBoot如何自定义Starter

参考:https://www.cnblogs.com/zt007/p/17118514.html

posted @ 2024-11-24 17:27  是笨小孩儿  阅读(77)  评论(0)    收藏  举报