【译】Spring Boot 2.0 官方迁移指南

前提

希望本文档将帮助您把应用程序迁移到 Spring Boot 2.0。

在你开始之前

首先,Spring Boot 2.0 需要 Java 8 或更高版本。不再支持 Java 6 和 7 了。

在 Spring Boot 2.0 中,许多配置属性被重新命名/删除,开发人员需要更新application.properties/ application.yml相应的配置。为了帮助你解决这一问题,Spring Boot 发布了一个新spring-boot-properties-migrator模块。一旦作为该模块作为依赖被添加到你的项目中,它不仅会分析应用程序的环境,而且还会在启动时打印诊断信息,而且还会在运行时为您暂时迁移属性。在您的应用程序迁移期间,这个模块是必备的:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
</dependency>

注意:完成迁移后,请确保从项目的依赖关系中删除此模块。

构建您的 Spring Boot 应用程序

Spring Boot Maven 插件

为了保持了一致性,并且避免与其他插件发生冲突,现在暴露的插件配置属性都以一个spring-boot前缀开始。

例如,以下命令prod使用命令行启用配置文件

mvn spring-boot:run -Dspring-boot.run.profiles=prod
Surefire 默认值

以前的 include/exclude 模式已与最新的 Surefire 默认设置保持一致。如果依赖于此插件,需要相应地更新插件配置。之前对应的配置如下:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
</configuration>
</plugin>

PS: 如果您使用 JUnit 5,则应将 Surefire 降级到 2.19.1。该**/*Tests.java版本不包含此模式,因此如果您依赖该模式,请确保将其添加到您的配置中。

Spring Boot Gradle 插件

Spring Boot 的 Gradle 插件在很大程度上已被重写,有了重大的改进。您可以在其参考文献和API文档中阅读关于插件功能的更多信息。

依赖管理

Spring Boot 的 Gradle 插件不再自动应用依赖管理插件。相反,Spring Boot 的插件现在可以通过导入正确版本的spring-boot-dependencies BOM 来应用依赖管理插件。当依赖管理被配置的时候,这一点会让你有更多的控制权。

对于大多数应用程序,使用应用依赖管理插件就足够了:

apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle

注意:依赖管理插件仍然是 spring-boot-gradle-plugin 的传递依赖项,所以不需要在 buildscript 配置中将其列为类路径依赖项。

建立可执行的 Jars 和 Wars

bootRepackage 任务已经被替换成 bootJarbootWar 任务,分别用于构建可执行的 jar 包和 war包。

配置更新

BootRunBootJarBootWar任务现在都使用mainClassName的属性来配置主类的名称。这使得三个特定于引导的任务相互一致,并将其与 Gradle 自己的应用程序插件进行对齐。

Spring Boot 特性

默认动态代理策略

Spring Boot 默认使用 CGLIB 做动态代理代理(基于类的动态代理),包括对 AOP 的支持。如果你需要基于接口的动态代理,你需要将spring.aop.proxy-target-class 设置为false

SpringApplication

Web 环境

Spring Boot 应用程序现在可以在更多模式下运行,因此spring.main.web-environment现在不推荐使用,spring.main.web-application-type属性可以提供更多的支持。

如果您想确保应用程序不启动 Web 服务器,则必须将该属性更改为:

spring.main.web-application-type=none

注意:可以通过 SpringApplicationsetWebApplicationType 方法实现。

Spring Boot 应用程序事件更改

我们已经添加了一个新事件ApplicationStartedEventApplicationStartedEvent在上下文刷新之后但在任何应用程序和命令行参数被调用之前发送。 ApplicationReadyEvent在任何应用程序和命令行参数被调用后发送。它表示应用程序已准备好为请求提供服务。

请参阅更新的参考文档。

在我们限制 Spring Boot 使用的根名称空间的数量的过程中,与标志相关的属性已被重定位到spring.banner

外部化配置

轻松的绑定

有关宽松绑定的规则已经收紧。我们假设一个现有的acme.my-project.my-name属性:

  1. 所有前缀必须是 kebab格式(小写,连字符分隔)acme.myProjectacme.my_project无效 - 您必须acme.my-project在此处使用。
  2. 属性名称可以使用 kebab-case(my-name),camel-case(myName)或 snake-case(my_name)。
  3. 环境属性(来自操作系统环境变量)必须使用通常的大写下划线格式,下划线只能用于分隔键的各个部分ACME_MYPROJECT_MYNAME

这种新的放松绑定具有以下几个优点:

  • 无需担心密钥的结构@ConditionalOnProperty:只要密钥是以规范格式定义的,支持的松散变体就可以透明地工作。如果您正在使用该prefix属性,则现在只需使用namevalue属性即可放置完整密钥。
  • RelaxedPropertyResolver不再可以Environment自动处理:env.getProperty("com.foo.my-bar")将找到一个com.foo.myBar属性。

org.springframework.boot.bind软件包不再可用,并被新的宽松绑定规则所取代。特别是,RelaxedDataBinder朋友已被新的BinderAPI 取代。以下样品MyPropertiesapp.acme前缀中进行绑定。

MyProperties target = Binder.get(environment)
.bind("app.acme", MyProperties.class)
.orElse(null);

由于现在内置了轻松绑定,因此只要使用其中一种支持的格式,就可以请求任何属性而不必关心案例:

FlagType flagType = Binder.get(environment)
.bind("acme.app.my-flag", FlagType.class)
.orElse(FlagType.DEFAULT);
@ConfigurationProperties 验证

如果您想打开验证,现在必须为您的@ConfigurationProperties对象添加注释@Validated

配置位置

spring.config.location配置的方式已被修复; 它提前将一个位置添加到默认位置列表中,现在它将替换默认位置。如果你是按照以前的方式进行处理,现在应该使用它spring.config.additional-location进行替换。

开发 Web 应用程序

嵌入式容器包装结构

为了支持响应式用例,嵌入式容器包结构已经被大幅度的重构。 EmbeddedServletContainer已被重新命名为,WebServer并且该org.springframework.boot.context.embedded包已被重新定位到org.springframework.boot.web.embedded。例如,如果您使用TomcatEmbeddedServletContainerFactory回调接口定制嵌入式 Tomcat 容器,则应该使用TomcatServletWebServerFactory

特定于 Servlet 的服务器属性

许多server.* 属性 ( Servlet 特有的) 已经转移到server.servlet

旧的属性新的属性
server.context-parameters.*server.servlet.context-parameters.*
server.context-pathserver.servlet.context-path
server.jsp.class-nameserver.servlet.jsp.class-name
server.jsp.init-parameters.*server.servlet.jsp.init-parameters.*
server.jsp.registeredserver.servlet.jsp.registered
server.servlet-pathserver.servlet.path
Web Starter 作为传递依赖

以前有几个 Spring Boot starter 是依赖于 Spring MVC 而传递的spring-boot-starter-web。在 Spring WebFlux 新的支持下,spring-boot-starter-mustachespring-boot-starter-freemarkerspring-boot-starter-thymeleaf不再依赖它。开发者有责任选择和添加spring-boot-starter-webspring-boot-starter-webflux

模板引擎

Mustache 模板曾经的文件扩展名是.html,现在的扩展名为 .mustache ,与官方规范和大多数 IDE 插件一致。您可以通过更改spring.mustache.suffix配置键来覆盖此新的默认值。

Jackson / JSON 支持

在 2.0 中,我们改变了 Jackson 配置的默认值,将 ISO-8601 字符串 写为 JSR-310 日期 。如果你想回到以前的行为,你可以添加spring.jackson.serialization.write-dates-as-timestamps=true到你的配置。

新的spring-boot-starter-json starter 收集了必要的位去读写 JSON。它不仅提供了jackson-databind,而且提供了和 Java8 一起运作的时候相当有用的组件:jackson-datatype-jdk8, jackson-datatype-jsr310jackson-module-parameter-names。如果你曾经手动地依赖这些组件,现在可以依赖这个新的 starter 取代。

Spring MVC 路径匹配默认行为更改

我们已决定在 Spring MVC 应用程序中更改后缀路径匹配的默认值(请参阅#11105)。按照 Spring Framework 中记录的最佳实践,此功能不再默认启用。

如果您的应用程序希望将请求"GET /projects/spring-boot.json"映射到@GetMapping("/projects/spring-boot")映射,则此更改会影响您。

有关此更多信息以及如何减轻此更改,请查阅Spring Boot中有关路径匹配和内容协商的参考文档。

Servlet 过滤器

Servlet 过滤器的默认调度程序类型现在是DipatcherType.REQUEST; 这使 Spring Boot 的默认值与 Servlet 规范的默认值一致。如果您希望将过滤器映射到其他调度程序类型,请使用FilterRegistrationBean注册您的过滤器。

注意:Spring Security 和 Spring Session 过滤器配置 ASYNC, ERROR以及 REQUEST 调度类型。

RestTemplateBuilder

requestFactory(ClientHttpRequestFactory)方法已被新requestFactory(Supplier<ClientHttpRequestFactory> requestFactorySupplier)方法所取代。Supplier允许构建器生成的每个模板使用它自己的请求工厂,从而避免共享工厂可能导致的副作用。见#11255。

WebJars 定位器

Spring Boot 1.x 使用并提供依赖关系管理org.webjars:webjars-locatorwebjars-locator是一个“命名不佳的库……包装webjars-locator-core项目”。org.webjars:webjars-locator应该更新依赖项来org.webjars:webjars-locator-core代替使用。

Security

Spring Boot 2 极大地简化了默认的安全配置,并使添加定制安全变得简单。Spring Boot 现在具有一种行为,只要您添加自己的 WebSecurityConfigurerAdapter 就会退出,而不是进行多种与安全性相关的自动配置。

如果您使用以下任何属性,则会受到影响:

security.basic.authorize-mode
security.basic.enabled
security.basic.path
security.basic.realm
security.enable-csrf
security.headers.cache
security.headers.content-security-policy
security.headers.content-security-policy-mode
security.headers.content-type
security.headers.frame
security.headers.hsts
security.headers.xss
security.ignored
security.require-ssl
security.sessions
默认安全

安全自动配置不再公开选项,并尽可能使用 Spring Security 默认值。一个明显的副作用是使用 Spring Security 的内容协商进行授权(表单登录)。

默认用户

默认情况下,Spring Boot 使用生成的密码配置单个用户。用户可以使用 spring.security.user.* 属性进行配置。要进一步定制用户或添加其他用户,您将不得不公开一个UserDetailsServicebean。

AuthenticationManager Bean

如果您想将 Spring Security AuthenticationManager作为 bean 公开,请覆盖authenticationManagerBean您的方法WebSecurityConfigurerAdapter并为其添加注释@Bean

OAuth2

从功能的 Spring Security OAuth 项目 迁移到核心 Spring Security。不再为依赖关系提供依赖管理,Spring Boot 2 通过 Spring Security 5 提供 OAuth 2.0 客户端支持。

如果您依赖尚未迁移的 Spring Security OAuth 功能,则需要在其他 jar 上添加依赖项,请查看文档以获取更多详细信息。我们还继续支持 Spring Boot 1.5,以便旧版应用程序可以继续使用它,直到提供升级路径。

执行器安全

执行器不再有单独的安全自动配置(management.security.*属性消失)。sensitive每个端点的标志也没有在安全配置中变得更加明确。如果您依赖于此行为,则需要创建或调整您的安全配置,以保护您选择角色的端点。

例如,假设以下配置:

endpoints.flyway.sensitive=false
endpoints.info.sensitive=true
management.security.roles=MY_ADMIN
http
.authorizeRequests()
.requestMatchers(EndpointRequest.to("health", "flyway")).permitAll()
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("MY_ADMIN")
...

需要注意的是在2.xhealthinfo在默认情况下启用(与health默认情况下不显示其细节)。为了与这些新的默认值一致,health已被添加到第一个匹配器。

使用 SQL 数据库

配置数据源

默认连接池已从 Tomcat 切换到 HikariCP。如果您过去spring.datasource.type在基于 Tomcat 的应用程序中强制使用 Hikari,现在可以删除重写。

特别是,如果你有这样的设置:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>

现在可以这样修改:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
WARN 消息隐含的’打开在视图’

从现在起,未明确启用的应用程序spring.jpa.open-in-view将在启动过程中收到警告消息。虽然这种行为是一种友好的默认行为,但如果您没有完全意识到为您做了什么,这可能会导致问题。此消息可确保您了解可在查看呈现期间执行数据库查询。如果你没有问题,你可以明确地配置这个属性来消除警告信息。

JPA 和 Spring Data

在 Spring Boot 1.x 中,一些用户正在扩展HibernateJpaAutoConfiguration以将高级自定义应用于自动配置EntityManagerFactory。为了防止发生这种错误的用例,Spring Boot 2 中不再可能扩展它。

为了支持这些用例,现在可以定义一个HibernatePropertiesCustomizerbean,它可以完全控制 Hibernate 属性,包括注册在上下文中声明为 bean 的 Hibernate 拦截器的能力。

Flyway

Flyway 配置键被移动到spring命名空间(即spring.flyway

升级到 Spring Boot 2 将会将 Flyway 升级3.x5.x。为确保模式升级顺利进行,请按照以下说明操作:

  • 首先将您的1.5.xSpring Boot 应用程序升级到 Flyway 4,请参阅Maven和Gradle的说明。
  • 一旦您的架构升级到了 Flyway 4,升级到 Spring Boot 2 并再次运行迁移以将您的应用程序移植到 Flyway 5。
Liquibase

Liquibase 配置键被移动到spring命名空间(即spring.liquibase

数据库初始化

基本DataSource初始化现在仅针对嵌入式数据源启用,并将在您使用生产数据库时立即关闭。新的spring.datasource.initialization-mode(替换spring.datasource.initialize)提供更多的控制。

更新默认的’创建 - 删除’处理

spring.jpa.hibernate.ddl-auto 属性默认为只有在没有使用 Liquibase 或 Flyway 等模式管理器时才使用嵌入式数据库进行创建。一旦检测到模式管理器,默认更改为 none

整合 NoSQL

Redis

现在使用的是 Lettuce 而不是 Jedis 作为 Redis 驱动程序spring-boot-starter-redis。如果您使用更高级别的Spring Data 构造,则应该发现变化是透明的。我们仍然支持 Jedis,如果您愿意,通过排除 io.lettuce:lettuce-core并添加 redis.clients:jedis,则可以自由切换依赖项。

Elasticsearch

Elasticsearch 已经升级到 6.0+。与 Elastic 宣布嵌入式 Elasticsearch 不再受支持一致,自动配置NodeClient已被删除。TransportClient可以通过使用spring.data.elasticsearch.cluster-nodes提供要连接的一个或多个节点的地址来自动配置。

高速缓存

用于缓存的专用 Hazelcast 自动配置。

无法自动配置常规HazelcastInstance和专用HazelcastInstance缓存。因此,该spring.cache.hazelcast.config属性已不再可用。

批量

在启动时执行批处理作业的 CommandLineRunner 的顺序为 0。

测试

Mockito 1.x

Mockito 1.x 不再支持@MockBean@SpyBean。如果你不用spring-boot-starter-test来管理你的依赖关系,你应该升级到 Mockito 2.x.

Spring Boot Actuator

Spring Boot 2 为 Actuator 带来了重要变化,无论是内部还是面向用户,请查阅参考指南中的更新部分和新的Actuator API文档。

您应该期望编程模型,配置密钥和某些端点的响应格式发生变化。Actuator 现在在 Spring MVC,Spring WebFlux 和Jersey 上得到本地支持。

构建

Actuator 的代码分为两个模块:现有的spring-boot-actuator和新的spring-boot-actuator-autoconfigure。如果您使用原始模块(spring-boot-actuator)导入 actuator,请考虑使用spring-boot-starter-actuator启动器替代它。

Keys 的配置结构

Endpoints 基础配置 key 已经统一:

旧的属性新的属性
endpoints.<id>.*management.endpoint.<id>.*
endpoints.cors.*management.endpoints.web.cors.*
endpoints.jmx.*management.endpoints.jmx.*
management.addressmanagement.server.address
management.context-pathmanagement.server.servlet.context-path
management.ssl.*management.server.ssl.*
management.portmanagement.server.port

基本路径

所有 endpoints 默认情况下都已移至 /actuator

我们修改了 management.server.servlet.context-path 的含义:它现在是 server.servlet.context-path 的端点管理的等价替代(只有在设置了 management.server.port 时才有效)。另外,您还可以使用新的单独属性 management.endpoints.web.base-path 为管理端点设置基本路径。

例如,如果你设置management.server.servlet.context-path=/managementmanagement.endpoints.web.base-path=/application,你就可以在下面的路径到达终点健康:/management/application/health

如果你想恢复 1.x 的行为(即具有/health代替/actuator/health),设置以下属性:

management.endpoints.web.base-path=/

审计事件 API 更改

AuditEventRepository 现在有一个包含所有可选参数的单一方法。

Endpoints

要通过 HTTP 使执行器端点可用,它需要同时启用公开。默认:

  • 无论您的应用程序中是否存在和配置 Spring Security,只有端点/health/info端点都是暴露的。
  • 所有端点,但/shutdown已启用。

您可以按如下方式公开所有端点:

management.endpoints.web.exposure.include=*

您可以通过以下方式显式启用/shutdown端点:

management.endpoint.shutdown.enabled=true

要公开所有(已启用)网络端点除env端点之外:

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env
Endpoint changes
1.x 端点2.0 端点(改变)
/actuator不再可用。 但是,在 management.endpoints.web.base-path 的根目录中有一个映射,它提供了到所有暴露端点的链接。
/auditeventsafter参数不再需要
/autoconfig重命名为 /conditions
/docs不再可用
/health现在有一个 management.endpoint.health.show-details 选项 never, always, when-authenticated,而不是依靠 sensitive 标志来确定 health 端点是否必须显示全部细节。 默认情况下,/actuator/health公开并且不显示细节。
/trace重命名为 /httptrace

端点属性已更改如下:

  • endpoints.<id>.enabled 已经转移到了 management.endpoint.<id>.enabled
  • endpoints.<id>.id 没有替换(端点的 ID 不再可配置)
  • endpoints.<id>.sensitive没有替代品(请参见执行器安全)
  • endpoints.<id>.path 已经转移到了 management.endpoints.web.path-mapping.<id>

端点格式

/actuator/mappings 端点大改变

JSON 格式已经更改为现在正确地包含有关上下文层次结构,多个DispatcherServlets,部署的 Servlet 和 Servlet 过滤器的信息。详情请参阅#9979。

Actuator API 文档的相关部分提供了一个示例文档。

/actuator/httptrace 端点大改变

响应的结构已经过改进,以反映端点关注跟踪 HTTP 请求 - 响应交换的情况。

迁移自定义端点

如果您有自定义执行器端点,请查看专用博客文章。该团队还撰写了一个 wiki 页面,介绍如何将现有的执行器端点迁移到新的基础架构。

Metrics

Spring Boot 自己的指标已被支持取代,包括自动配置,用于 icrometer 和 dimensional 指标。

设置 icrometer

如果您的 Spring Boot 2.0 应用程序已依赖于 Actuator,则 icrometer 已在此处并自动配置。如果您希望将度量标准导出到 Prometheus,Atlas 或 Datadog 等外部注册表,Micrometer 将为许多注册表提供依赖关系; 您可以使用spring.metrics.*属性配置您的应用程序以导出到特定的注册表。

迁移定制计数器/量表

您可以通过以下方式创建各种指标,而不是在应用程序代码中注入CounterServiceGaugeService的实例:

  • 注入MeterRegistry和调用方法。
  • 直接调用静态方法Counter featureCounter = Metrics.counter("feature");

开发者工具

热拔插

由于 Spring Loaded 项目被搁置,它在 Spring Boot 的支持已被删除。我们建议使用 Devtools。

Devtools 远程调试隧道

已经从 Devtools 中删除了对通过 HTTP 进行隧道远程调试的支持。

已删除的功能

以下功能不再可用:

  • CRaSH 支持
  • Spring Mobile 的自动配置和依赖关系管理。
  • Spring Social 的自动配置和依赖关系管理。
  • 依赖关系管理commons-digester

依赖版本

以下库的最低支持版本已更改:

  • Elasticsearch 5.6
  • Gradle 4
  • Hibernate 5.2
  • Jetty 9.4
  • Spring Framework 5
  • Spring Security 5
  • Tomcat 8.5

参考资料

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指Offer - 面试题22. 链表中倒数第k个节点(快慢指针)

1. 题目 输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表的尾节点是倒数第1个节点。例如&#xff0c;一个链表有6个节点&#xff0c;从头节点开始&#xff0c;它们的值依次是1、2、3、4、5、6。这个…

AI正在改变制造业!快递单信息抽取、智能物流仓案例盘点

大家好&#xff0c;我是卖萌酱。制造业作为国民经济主体&#xff0c;是国家创造力、竞争力和综合国力的重要体现。作为制造强国建设的主攻方向&#xff0c;智能制造发展水平关乎我国未来制造业的全球地位。制造业与物流结合紧密&#xff0c;随着制造业的高速发展&#xff0c;对…

Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent

今天继续来聊Spring Boot 2.0的新特性。本文将具体说说2.0版本中的事件模型&#xff0c;尤其是新增的事件&#xff1a;ApplicationStartedEvent。 在Spring Boot 2.0中对事件模型做了一些增强&#xff0c;主要就是增加了ApplicationStartedEvent事件&#xff0c;所以在2.0版本中…

剑指Offer - 面试题57. 和为s的两个数字(双指针)

1. 题目 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;则输出任意一对即可。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[2,7] 或者 [7,…

爷青结!吴恩达十年《机器学习》课程关闭注册!网友:一个时代的终结

文 | 杜伟、陈萍源 | 机器之心俗语说&#xff0c;旧的不去新的不来。也许新课程又会成为新的经典呢。要说人工智能领域的课程&#xff0c;斯坦福大学客座教授吴恩达的《机器学习》&#xff08;Machine Learning&#xff09;堪称经典。该课程最开始于 2012 年在 Coursera 上线&a…

Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0&#xff0c;对原有的属性绑定功能做了非常多的改进以帮助我们更容易的在Spring应用中加载和读取配置信息。下面本文就来说说Spring Boot 2.0中对配置的改进。 配置文件绑定 简单类型 在Spring Boot 2.0中对配置属性加载的时候会…

剑指Offer - 面试题57 - II. 和为s的连续正数序列(滑动窗口)

1. 题目 输入一个正整数 target &#xff0c;输出所有和为 target 的连续正整数序列&#xff08;至少含有两个数&#xff09;。 序列内的数字由小到大排列&#xff0c;不同序列按照首个数字从小到大排列。 示例 1&#xff1a; 输入&#xff1a;target 9 输出&#xff1a;[[…

博士读一半,导师跳槽了!博士生把亲身经历发在了Science上

源 | 微算云平台、知乎有这样一个迫在眉睫的问题&#xff0c;困扰着博士生&#xff1a;导师要跳槽&#xff0c;自己该怎么办&#xff1f;▲图源&#xff1a;知乎同样的&#xff0c;Jessica Toothaker 是匹兹堡大学医学院的一名博士生&#xff0c;也是耶鲁大学的访问学生。在她读…

Spring Boot 2.0正式发布,升还是不升呢?

Spring帝国 Spring几乎是每一位Java开发人员都耳熟能详的开发框架&#xff0c;不论您是一名初出茅庐的程序员还是经验丰富的老司机&#xff0c;都会对其有一定的了解或使用经验。在现代企业级应用架构中&#xff0c;Spring技术栈几乎成为了Java语言的代名词&#xff0c;那么Sp…

剑指Offer - 面试题66. 构建乘积数组(正反遍历)

1. 题目 给定一个数组 A[0,1,…,n-1]&#xff0c;请构建一个数组 B[0,1,…,n-1]&#xff0c;其中 B 中的元素 B[i]A[0]A[1]…A[i-1]A[i1]…A[n-1]。不能使用除法。 示例: 输入: [1,2,3,4,5] 输出: [120,60,40,30,24]提示&#xff1a; 所有元素乘积之和不会溢出 32 位整数 a.l…

Spring Boot 2.0与Java 9

Java 9发布至今已经有半年之久&#xff0c;Spring Boot对其的支持进度也快接近完成&#xff0c;本文就来整理一下在Java 9上运行Spring Boot的一些要点。 必须使用Spring Boot2.0 在Spring Boot的版本计划中明确说明了2.0版本开始才对Java 9进行支持&#xff0c;而1.x版本暂时…

扩散模型在图像生成领域大火,风头超过GAN?

文 | Zhifeng源 | 知乎首先说说我的背景。我从20年diffusion model刚出来就开始&#xff08;花部分精力&#xff09;做这个问题&#xff0c;到目前已经有了3篇相关paper (DiffWave, FastDPM, PDR), 之后也会将其作为我的主要方向之一。我算是这一领域比较早期的研究者&#xff…

剑指Offer - 面试题50. 第一个只出现一次的字符(unordered_map)

1. 题目 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 示例: s "abaccdeff" 返回 "b"s "" 返回 " "限制&#xff1a; 0 < s 的长度 < 50000来源&#xff1a;力扣&#xff08;LeetCode&…

618大促将至,用AI挖掘差评,零代码实现亿级评论观点情感分析

文 | 卖萌酱马上就要到一年一度的618大促&#xff0c;卖萌酱在添加购物车时&#xff0c;选择困难症又犯了。如今的电商评论区&#xff0c;大量刷单行为淹没了重要的产品评价&#xff0c;有的被淹没在了追评区&#xff0c;有的甚至已经不分好评/中评/差评区了&#xff0c;而是“…

Spring Boot 2.0 新特性和发展方向

以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上&#xff0c; Java 6 和 7 不再支持。 内嵌容器包结构调整 为了支持reactive使用场景&#xff0c;内嵌的容器包结构被重构了的幅度有点大。EmbeddedServletContainer被重命名为WebServer&#xff0c;并且org.springf…

剑指Offer - 面试题40. 最小的k个数(排序/大顶堆)

1. 题目 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] 或者 [2,1]示例 2&#xff…

Nature:大批学者正在涌向工业界,与国内趋势相反?

文 | 杨净 明敏 发自 凹非寺源 | 量子位Nature最新发文&#xff1a;学术界正刮起一阵离职潮。这当中&#xff0c;处于职业中期的科学家尤甚。而他们的集体归宿&#xff0c;是转向工业界。事实上&#xff0c;这种趋势由来已久。早在2018年一项研究预测显示&#xff0c;高等教育将…

剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)

1. 题目 给定一棵二叉搜索树&#xff0c;请找出其中第k大的节点。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4限制&#xff1a; 1 ≤ k ≤ 二叉搜索树元素个数来源&#xf…

Spring Boot中使用LDAP来统一管理用户信息

很多时候&#xff0c;我们在构建系统的时候都会自己创建用户管理体系&#xff0c;这对于开发人员来说并不是什么难事&#xff0c;但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下&#xff0c;如果每个系统维护自己的用户信息&#xff0c;那么此时用户信息的同步…

剑指Offer - 面试题53 - II. 0~n-1中缺失的数字(二分、位运算)

文章目录1. 题目2. 解题2.1 充分利用题目信息2.2 位运算2.3 二分查找1. 题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出…