Logback配置属性
Logback一些配置项改名了,更加表名了它是logback的配置项。
新增了配置类LogbackLoggingSystemProperties用于对应,它继承自之前的LoggingSystemProperties
之前的配置项有些被废弃(此版本还未删除,后续版本肯定会删除的),对应关系如下:
一些属性是被放到system environment里面的:
不再注册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个类来处理(老方式仅有区区几个类),可见其重视、重要程度。因此,为了适应未来的发展,你一定要掌握,并且越早越好,下篇将为你揭晓。