Spring Boot 2.0 遷移指南

来源:https://www.cnblogs.com/springforall/archive/2019/07/16/11198337.html
-Advertisement-
Play Games

![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRsmaa4IfbolVRG2WQwhXrchmVWS8Q/640?tp=webp&wxfrom=5&w ...


img

前提

本文檔將幫助您把應用程式遷移到 Spring Boot 2.0。

在你開始之前

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

在 Spring Boot 2.0 中,許多配置屬性被重新命名/刪除,開發人員需要更新application.propertiesapplication.yml相應的配置。為了幫助你,Spring Boot 發佈了一個新spring-boot-properties-migrator模塊。一旦作為依賴添加到項目中,這不僅將分析應用程式的環境併在啟動時列印診斷信息,而且還會在運行時為您暫時遷移屬性。這是您的應用程式遷移期間必須具備的條件:

1<dependency>
2    <groupId>org.springframework.boot</groupId>
3    <artifactId>spring-boot-properties-migrator</artifactId>
4</dependency>

註意:完成遷移後,請確保從項目的依賴關係中刪除此模塊。

構建您的 Spring Boot 應用程式

Spring Boot Maven 插件

如今暴露為屬性的插件配置屬性都以一個spring-boot首碼開始,以保持一致性並避免與其他插件發生衝突。

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

1mvn spring-boot:run -Dspring-boot.run.profiles=prod
Surefire 預設值

自定義包含/排除模式已與最新的 Surefire 預設設置保持一致。如果您依賴我們的,請相應地更新您的插件配置。他們曾經如下:

 1<plugin>
 2    <groupId>org.apache.maven.plugins</groupId>
 3    <artifactId>maven-surefire-plugin</artifactId>
 4    <configuration>
 5        <includes>
 6             <include>**/*Tests.java</include>
 7             <include>**/*Test.java</include>
 8        </includes>
 9        <excludes>
10            <exclude>**/Abstract*.java</exclude>
11        </excludes>
12    </configuration>
13</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 來應用依賴管理插件。這使您可以更好地控制配置依賴性管理的方式和時間。

對於大多數使用依賴管理插件的應用程式來說就足夠了:

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

註意:依賴管理插件仍然是 spring-boot-gradle-plugin 的傳遞依賴項,所以不需要在 buildscript 配置中將其列為類路徑依賴項。

建立可執行的 Jars 和 Wars

bootRepackage任務已被替換bootJar,並bootWar分別建立可執行的 Jars 和 Wars 的任務。jarwar任務不再參與。

配置更新

BootRunBootJarBootWar任務現在都使用mainClassName的屬性來配置主類的名稱。這使得三個特定於引導的任務相互一致,並將其與 Gradle 自己的應用程式插件進行對齊。

Spring Boot 特性

預設代理策略

Spring Boot 預設使用 CGLIB 代理,包括 AOP 支持。如果你需要基於代理的代理,你需要設置spring.aop.proxy-target-classfalse

SpringApplication

Web 環境

Spring Boot 應用程式現在可以在更多模式下運行,因此spring.main.web-environment現在不推薦使用屬性來支持spring.main.web-application-type更多的控制。

如果您想確保應用程式不啟動 Web 伺服器,則必須將該屬性更改為:

1spring.main.web-application-type=none

註意:還有一個setWebApplicationTypeSpringApplication,如果你想這樣做編程。

Spring Boot 應用程式事件更改

我們已經添加了一個新事件ApplicationStartedEvent。 ApplicationStartedEvent在上下文刷新之後但在任何應用程式和命令行參數被調用之前發送。 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首碼中進行綁定。

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

由於現在內置了輕鬆綁定,因此只要使用其中一種支持的格式,就可以請求任何屬性而不必關心案例:

1FlagType flagType = Binder.get(environment)
2        .bind("acme.app.my-flag", FlagType.class)
3        .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-path | server.servlet.context-path | | server.jsp.class-name | server.servlet.jsp.class-name | | server.jsp.init-parameters.* | server.servlet.jsp.init-parameters.* | | server.jsp.registered | server.servlet.jsp.registered | | server.servlet-path | server.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 配置預設值,將 JSR-310 日期寫為 ISO-8601 字元串。如果你想回到以前的行為,你可以添加spring.jackson.serialization.write-dates-as-timestamps=true到你的配置。

新的spring-boot-starter-json starter 收集必要的位以讀取和寫入 JSON。它不僅提供了jackson-databind,與Java8 工作時也是有用的模塊:jackson-datatype-jdk8jackson-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 過濾器配置 ASYNCERROR以及 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 就會退出,而不是進行多種與安全性相關的自動配置。

如果您使用以下任何屬性,則會受到影響:

 1security.basic.authorize-mode
 2security.basic.enabled
 3security.basic.path
 4security.basic.realm
 5security.enable-csrf
 6security.headers.cache
 7security.headers.content-security-policy
 8security.headers.content-security-policy-mode
 9security.headers.content-type
10security.headers.frame
11security.headers.hsts
12security.headers.xss
13security.ignored
14security.require-ssl
15security.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每個端點的標誌也沒有在安全配置中變得更加明確。如果您依賴於此行為,則需要創建或調整您的安全配置,以保護您選擇角色的端點。

例如,假設以下配置:

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

需要註意的是在2.xhealthinfo在預設情況下啟用(與health預設情況下不顯示其細節)。為了與這些新的預設值一致,health已被添加到第一個匹配器。

使用 SQL 資料庫

配置數據源

預設連接池已從 Tomcat 切換到 HikariCP。如果您過去spring.datasource.type在基於 Tomcat 的應用程式中強制使用 Hikari,現在可以刪除重寫。

特別是,如果你有這樣的設置:

 1<dependency>
 2    <groupId>org.springframework.boot</groupId>
 3    <artifactId>spring-boot-starter-data-jpa</artifactId>
 4    <exclusions>
 5        <exclusion>
 6            <groupId>org.apache.tomcat</groupId>
 7            <artifactId>tomcat-jdbc</artifactId>
 8        </exclusion>
 9    </exclusions>
10</dependency>
11
12<dependency>
13    <groupId>com.zaxxer</groupId>
14    <artifactId>HikariCP</artifactId>
15</dependency>

現在可以這樣修改:

1<dependency>
2    <groupId>org.springframework.boot</groupId>
3    <artifactId>spring-boot-starter-data-jpa</artifactId>
4</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)導入執行器,請考慮使用spring-boot-starter-actuator啟動器替代它。

Keys 的配置結構

Endpoints 基礎配置 key 已經統一:

| 舊的屬性 | 新的屬性 | | ------------------------- | ---------------------------------------- | | endpoints.<id>.* | management.endpoint.<id>.* | | endpoints.cors.* | management.endpoints.web.cors.* | | endpoints.jmx.* | management.endpoints.jmx.* | | management.address | management.server.address | | management.context-path | management.server.servlet.context-path | | management.ssl.* | management.server.ssl.* | | management.port | management.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),設置以下屬性:

1management.endpoints.web.base-path=/

審計事件 API 更改

AuditEventRepository 現在有一個包含所有可選參數的單一方法。

Endpoints

要通過 HTTP 使執行器端點可用,它需要同時啟用和公開。預設:

  • 無論您的應用程式中是否存在和配置 Spring Security,只有端點/health/info端點都是暴露的。
  • 所有端點,但/shutdown已啟用。

您可以按如下方式公開所有端點:

1management.endpoints.web.exposure.include=*

您可以通過以下方式顯式啟用/shutdown端點:

1management.endpoint.shutdown.enabled=true

要公開所有(已啟用)網路端點除env端點之外:

1management.endpoints.web.exposure.include=*
2management.endpoints.web.exposure.exclude=env
Endpoint changes

img

端點屬性已更改如下:

  • 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 項目已移至 attic,它在 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


推薦閱讀:

img


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring Cloud Alibaba | Nacos集群部署 [TOC] 1. Nacos支持三種部署模式 單機模式 用於測試和單機試用。 集群模式 用於生產環境,確保高可用。 多集群模式 用於多數據中心場景。 以上是官方提供的三種部署方式:單機模式對於企業來講,僅可用於測試環境或者開發環境,不 ...
  • <?phpclass db{ public $table=null; public $pdo; public $where=null; //where 條件 public $field=null; //要查詢的條件 public function __construct() { $this->pdo ...
  • Spring Cloud Alibaba | Nacos配置管理 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列文章全採用以上版本 [TOC] 上一篇 "《Spring Cloud Alibaba | Nacos服務註冊 ...
  • 解壓壓縮包會有一個種子文件。直接迅雷下載即可,包含了韓順平老師的java入門視頻,jdbc,jsp,servlet,oracle,hibermate,spring,SHH框架,struct,linux,等十套視頻,並且還包含了配套的源碼。迅雷下載速度很快。20兆的寬頻下載速度大概是2.3MB/s,沒 ...
  • vector 是最簡單、最常用的數據存儲形式。 vector 似乎一組可以通過索引來訪問的順序存儲的數據元素。 我們可以用 vector 名和索引號的組合來表示一個具體的數據元素 例如:v[0]是5,v[1]是7。 vector 的索引號總是從“0”開始,每次加1. vector “知道自己的大小” ...
  • 經過接近1個月的時間,ElasticSearch6.x實戰教程終於成冊。這本實戰教程小冊有很多不足(甚至可能有錯誤),也是第一次完整推出一個系列的教程。 1年前,我開始真正接觸ES,在此之前僅停留在知道的階段,甚至連瞭解都算不上。1年後跳槽,新的知識新的領域爆炸式的噴涌而出,分散式、ES、Redis ...
  • 消費組和消費者 1. 消費組和消費者是一對多的關係。 2. 同一個消費組的消費者可以消費多個分區,且是獨占的。 3. 消費者的分區分配策略由介面 定義,內置三種分配策略 、`RoundRobinAssignor StickyAssignor`,支持自定義策略。 4. 不同消費組可以消費相同的分區,互 ...
  • 題目 不同路徑 1 一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 問總共有多少條不同的路徑? 輸入說明 例如,上圖是一個 7 x 3 的網格。有多少可能的路 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...