Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)(下)

简介: Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)(下)

Logback配置属性

Logback一些配置项改名了,更加表名了它是logback的配置项。


新增了配置类LogbackLoggingSystemProperties用于对应,它继承自之前的LoggingSystemProperties


之前的配置项有些被废弃(此版本还未删除,后续版本肯定会删除的),对应关系如下:

image.png

一些属性是被放到system environment里面的:


image.png


不再注册DefaultServlet


从Spring Boot 2.4开始,默认将不会再注册DefaultServlet。因为在绝大多数的应用中,Spring MVC提供的DispatcherServlet唯一需要被注册的Servlet。从源码处感受下这次改动:


AbstractServletWebServerFactory:
// 2.4.0之前版本,默认值是true
private boolean registerDefaultServlet = true;
// 2.4.0以及之后版本,默认值是false
private boolean registerDefaultServlet = false;


当然喽,若你的工程强依赖于此Servelt,那么可以通过此配置项server.servlet.register-default-servlet = true把它注册上去。


补课:什么是DefaultServlet?


它是Java EE提供的标准技术,如Tomcat、Jetty等都提供了这个类。简而言之它的作用就是兜底(拦截/),当别的servlet都没匹配上时就交给它来处理,一般用于处理静态资源如.jpg,.html,.js这类的静态文件。


DefaultServlet在传统web容器里,会被配置在tomcat目录(此处以tomcat为例)下的conf/web.xml里:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>


说明:tomcat下的web.xml对其加载的所有的Application都生效,并且最终和Application自己的web.xml内容合并,遇相同的话后者优先级更高


在Spring Boot 嵌入式容器里配置是这样的(完全等价于xml配置):

private void addDefaultServlet(Context context) {
  Wrapper defaultServlet = context.createWrapper();
  defaultServlet.setName("default");
  defaultServlet.setServletClass("org.apache.catalina.servlets.DefaultServlet");
  defaultServlet.addInitParameter("debug", "0");
  defaultServlet.addInitParameter("listings", "false");
  defaultServlet.setLoadOnStartup(1);
  // Otherwise the default location of a Spring DispatcherServlet cannot be set
  defaultServlet.setOverridable(true);
  context.addChild(defaultServlet);
  context.addServletMappingDecoded("/", "default");
}


值得注意的是:Spring Boot注册的DispatcherServlet的path也是/(覆盖掉了DefaultServelt)。在Spring MVC环境下倘若是静态资源,也不用DefaultServelt费心,Spring MVC专门提供了一个DefaultServletHttpRequestHandler用于处理静态资源(虽然最终还是Dispatcher给defaultServlet去搞定)。


现在的Spring Boot服务大都是REST服务,并无静态资源需要提供,因此就没有必要启用DefaultServletHttpRequestHandler和注册DefaultServlet来增加不必要的开销喽。


HTTP traces不再包含cookie头


Http traces默认将不再包含请求头Cookie以及响应头Set-Cookie。源码处感受一下:

org.springframework.boot.actuate.trace.http.Include:
// 2.4.0版本之前:包含COOKIE_HEADERS这个头
static {
  Set<Include> defaultIncludes = new LinkedHashSet<>();
  defaultIncludes.add(Include.REQUEST_HEADERS);
  defaultIncludes.add(Include.RESPONSE_HEADERS);
  defaultIncludes.add(Include.COOKIE_HEADERS);
  defaultIncludes.add(Include.TIME_TAKEN);
  DEFAULT_INCLUDES = Collections.unmodifiableSet(defaultIncludes);
}
// 2.4.0版本以及之后:不包含COOKIE_HEADERS这个头
static {
  Set<Include> defaultIncludes = new LinkedHashSet<>();
  defaultIncludes.add(Include.REQUEST_HEADERS);
  defaultIncludes.add(Include.RESPONSE_HEADERS);
  defaultIncludes.add(Include.TIME_TAKEN);
  DEFAULT_INCLUDES = Collections.unmodifiableSet(defaultIncludes);
}


若你仍旧想保留老的习惯,那么请用配置项management.trace.http.include = cookies, errors, request-headers, response-headers自行控制。


Neo4j


这个版本对Neo4j的支持进行了重大调整。直接用源码来说明差异:


Spring Boot 2.4.0之前版本:


@ConfigurationProperties(prefix = "spring.data.neo4j")
public class Neo4jProperties implements ApplicationContextAware { ... }
// 无Neo4jDataProperties配置类


Spring Boot 2.4.0以及之后版本:

@ConfigurationProperties(prefix = "spring.neo4j")
public class Neo4jProperties { ... }
@ConfigurationProperties(prefix = "spring.data.neo4j")
public class Neo4jDataProperties { ... }


其它升级关注点


  • Spring Framework 5.3:Spring Boot 2.4.0使用的是5.3.0主线分支(之前使用的5.2.x或更低)
  • Spring Framework 5.3的新特性应该重点关注,请移步我上篇文章:Spring Framework 5.3.0正式发布,在云原生路上继续发力
  • Spring Data 2020.0:Spring Boot 2.4.0使用的是最新发布的Spring Data 2020.0
  • 此版本的命名方式不同于之前,是因为使用了Spirng最新的release train命名方式。Spring在2020年4月份发布了最新的版本命名方式,可参考前面这篇文章:Spring改变版本号命名规则:此举对非英语国家很友好
  • 支持Java 15:此版本的Spring Boot完全支持Java 15,最小支持依旧是Java 8
  • 自定义属性名支持:当使用构造函数绑定时,属性的名称需要和参数名称保持一样。如果您想使用Java保留关键字,这可能是一个问题。如下例子:


@ConfigurationProperties(prefix = "sample")
public class SampleConfigurationProperties {
  private final String importValue;
  // import是Java关键字
  public SampleConfigurationProperties(@Name("import") String importValue) {
    this.importValue = importValue;
  }
}


@Name注解是Spring Boot 2.4.0新增的注解,能标注在ElementType.PARAMETER上


  • 支持导入无扩展名的配置文件:如果您有这样的需求,现在就可以通过向Spring Boot引导提供关于内容类型的提示来导入这些文件
  • 此版本对Spring Boot的配置文件加载进行了完全重新改造,并且不向下兼容,具体参见下篇文章
  • 新增StartupEndpoint:显示有关应用程序启动的信息。此端点可以帮助您识别启动时间超过预期的bean
  • 此端点依赖于Spring Framework 5.3.0新提供的应用启动追踪新特性。具体可参考ApplicationStartup和StartupStep这个两个API是如何做追踪的
  • 新增RedisCacheMetrics:用于监控使用redis时的puts、gets、deletes以及缓存命中率等信息
  • 此指标信息默认不开启,需你增加配置spring.cache.redis.enable-statistics = true
  • 新增些Web配置项:spring.web.locale、spring.web.locale-resolver、spring.web.resources.*、management.server.base-path,这些属性既支持Servlet也支持WebFlux
  • 对应的只能用于 Spring MVC或servelt下配置项spring.mvc.locale/spring.mvc.locale-resolver/spring.resources.*/management.server.servlet.context-path均以标注为过期
  • 支持Flyway 7:这个版本升级到Flyway 7,带来了一些额外的属性。如:spring.flyway.url/user/password(开源版本);spring.flyway.cherry-pick/jdbc-properties...(团队版本)
  • H2数据库控制台支持配置密码:可通过spring.h2.console.settings.web-admin-password属性配置通过密码访问H2控制台
  • 增强的错误分析器FailureAnalizers:现在即使你还没有创建ApplicationContext,FailureAnalizers都会生效来帮你定位错误位置
  • 处理/标注Spring Boot 2.2和2.3中过期项:按照Spring Boot的版本兼容性政策,在2.2版本已被标记为@Deprecated的在2.4.0版本会被删除,在2.3版本中被标记为@Deprecated的计划在2.5.0版本中将其移除


✍总结


这是A哥奉给大家的,对Spring Boot2.4.0版本新特性的介绍,希望对你有些帮助。


Spring Boot 2.4.0版本的升级目标,基本和Spring Framework 5.3.0保持一致:为云原生做努力。表现在除了删除些无用类,禁止不需要的类的加载外,重点还会体现在它对配置文件加载机制的重构上,这将是下文的内容,也是本次升级的重头戏,敬请关注。


Spring Boot重写了对配置文件的加载机制,并且新引入了近40个类来处理(老方式仅有区区几个类),可见其重视、重要程度。因此,为了适应未来的发展,你一定要掌握,并且越早越好,下篇将为你揭晓。


相关文章
|
1月前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
90 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
26天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
9天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
21 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
55 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
54 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
63 2
|
2月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
|
3月前
|
Java Spring 传感器
AI 浪潮席卷,Spring 框架配置文件管理与环境感知,为软件稳定护航,你还在等什么?
【8月更文挑战第31天】在软件开发中,配置文件管理至关重要。Spring框架提供强大支持,便于应对不同环境需求,如电商项目的开发、测试与生产环境。它支持多种格式的配置文件(如properties和YAML),并能根据环境加载不同配置,如数据库连接信息。通过`@Profile`注解可指定特定环境下的配置生效,同时支持通过命令行参数或环境变量覆盖配置值,确保应用稳定性和可靠性。
62 0
|
6月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
下一篇
无影云桌面