1. 程式人生 > >springboot番外之注意點補充

springboot番外之注意點補充

個人說明:本文內容都是從為知筆記上覆制過來的,樣式難免走樣,以後再修改吧。另外,本文可以看作官方文件的選擇性的翻譯(大部分),以及個人使用經驗及問題。

其他說明: 如果對Spring Boot沒有概念,請先移步上一篇文章 Spring Boot 學習。本篇原本是為了深入瞭解下Spring Boot而出現的。 另外,Spring Boot 仍然是基於Spring的,建議在趕完工之後深入學習下Spring,有興趣可以看看我的  Spring 4 官方文件學習(十一)Web MVC 框架 。歡迎探討,笑~
目錄:
  1. 內建Servlet Container
  2. 使用Spring Boot
  3. 安裝Spring Boot CLI
  4. 開發一個簡單的Spring Boot應用--使用最原始的方式
    1. 建立一個資料夾
    2. 新建一個pom.xml檔案
    3. 命令:mvn package
    4. 新增依賴
    5. 開始寫程式碼
    6. 啟動專案
    7. 打包
    8. 執行
  5. Dependency Management
    1. 繼承 spring-boot-starter-parent
    2. 不繼承 spring-boot-starter-parent
  6. Starters
  7. 自動配置
  8. Spring Beans 和 依賴注入(略)
  9. @SpringBootApplication
  10. 執行Spring Boot Application
    1. 從IDE中執行
    2. 執行fat jar(executable jar)
    3. 使用Maven Plugin
    4. Hot swapping
  11. Developer tools
    1. Property defaults
    2. 自動重啟
    3. 熱載入 LiveReload
    4. 全域性設定
    5. 遠端應用
      1. 遠端除錯
  12. 生產打包

  一、內建Servlet Container:
Name Servlet Version Java Version

Tomcat 8

3.1

Java 7+

Tomcat 7

3.0

Java 6+

Jetty 9.3

3.1

Java 8+

Jetty 9.2

3.1

Java 7+

Jetty 8

3.0

Java 6+

Undertow 1.3

3.1

Java 7+

  此外,你仍然可以部署Spring Boot專案到任何相容Servlet3.0+的容器。
二、使用Spring Boot。     你可以像使用標準的Java庫檔案一樣使用Spring Boot。簡單的將需要的  spring-boot-*.jar 新增到classpath即可。     Spring Boot不要求任何特殊的工具整合,所以可以使用任何IDE,甚至文字編輯器。       只是,仍然建議使用build工具:Maven 或 Gradle。       Spring Boot依賴 使用  org.springframework.boot  groupId  。     通常,讓你的Maven POM檔案繼承 spring-boot-starter-parent,並宣告一個或多個 Starter POMs依賴即可。Spring Boot也提供了一個可選的 Maven Plugin來建立可執行的jars。   如下: 複製程式碼
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>

    <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <!-- Package as an executable jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
複製程式碼       需要注意的是, spring-boot-starter-parent 是一個非常好的方法,但並不適用於所有情況。有時你需要繼承其他的POM,或者你不喜歡預設的設定。-- 辦法見後面。   三、安裝Spring Boot CLI。     這是一個命令列工具,可以執行Groove指令碼。是執行一個Spring Boot的最快途徑。     -- 好吧,Linux下無敵,Win下還是休息吧。   四、開發一個簡單的Spring Boot應用--使用最原始的方式。     務必注意:前提是maven + jdk。      1、建立一個資料夾。SpringBootSample01      2、新建一個pom.xml檔案。內容如下:
複製程式碼
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>
    <!-- Additional lines to be added here... -->
</project>
複製程式碼      3、上面沒有新增任何依賴,但仍然可以build。命令列:mvn package。注意,是當前路徑下 //SpringBootSample01/ 。         當然,你也可以使用IDE,不過使用文字編輯器會讓我們對它更理解。               4、現在需要新增依賴 -- 其實就是把依賴的jar新增到buildpath。         由於我們已經繼承了 spring-boot-starter-parent ,而 spring-boot-starter-parent 又提供了 dependency-management ,所以我們可以忽略被選中依賴的版本。         在新增依賴之前,我們先看一下現在已有什麼:mvn dependency:tree。該命令會列印一個當前專案的依賴樹。               結果表明,當前沒有任何依賴。             OK,現在我們新增一個Starter 模組。
複製程式碼
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
複製程式碼             現在再次檢視一下依賴樹。             可以看出,spring-boot-starter-web  包含了很多內容,spring-webmvc、spring-web、jackson、validation、tomcat、starter。        5、現在就可以開始寫程式碼了。         由於Maven預設編譯路徑為 src/main/java 下面的原始碼,所以,預設設定下,需要建立這些資料夾。                 然後,編寫檔案 src/main/java/Example.java: 複製程式碼
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }
}
複製程式碼         這裡我們只需要關心 @EnableAutoConfiguration 即可。這個註解是讓Spring Boot 猜測 你想怎麼配置Spring,但實際上,它是根據你新增到classpath中的依賴來判斷的。         注意,自動配置 可以配合 Starter POMs 一起工作,但二者不是捆綁到一起的。你仍然可以將Starter POMs中的依賴單獨揀出使用,Spring Boot還是會自動配置。          6、啟動專案。由於我們使用了 spring-boot-starter-parent POM,所以可以使用 mvn spring-boot:run來啟動專案(根路徑)。             啟動之後就可以訪問了,預設地址:  http://localhost:8080/          7、打包。executable jars 又稱 fat jars,是可以直接在生產環境中執行的,包含所有編譯生成的class檔案以及依賴包。             注意,Spring Boot的這種打包方式需要使用Spring Boot提供的 spring-boot-maven-plugin 。          複製程式碼
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
複製程式碼             注意,spring-boot-starter-parent POM中包含了 <executions> 的配置資訊,綁定了 repackage goal (maven)。如果你不使用parent POM,你需要自己來宣告這個配置資訊。             現在,可以打包了: mvn package 。                          現在,你可以在/target目錄下看到 myproject-0.0.1-SNAPSHOT.jar ,大約10 Mb左右。可以通過 jar tvf target/myproject-0.0.1-SNAPSHOT.jar 來檢視其中的內容。             此外,在/target目錄下,還可以看到 myproject-0.0.1-SNAPSHOT.jar.original ,這是Maven打包出來的---在Spring Boot repackage 之前。              8、執行。正常的jar執行:java -jar target/myproject-0.0.1-SNAPSHOT.jar  ,啟動資訊如下:                          執行 ctrl+c,退出。 五、Dependency Management 每個版本的Spring Boot都提供了一個依賴列表。這個列表包含了你可能通過Spring Boot用到的所有的Spring模組以及第三方庫。該列表可以以 BOM(Bills of Material)的形式支援Maven。 ---  怎麼理解BOM和Starter?什麼區別??   1、繼承 spring-boot-starter-parent :        spring-boot-starter-parent project        預設是 Java 1.6。 Resource filtering。exec plugin、surefire、Git commit ID、shade。       Resource filtering for application.properties 和 application.yml,以及,profile-specific file,如application-foo.properties 或 application-foo.yml。       -- 注意Maven filtering使用  @[email protected] 佔位符,你可以在Maven property中覆蓋:resource.delimiter。          如果不想使用Spring Boot中的預設版本,可以在<properties>覆蓋相應的版本,如,想使用不同版本的Spring Data,具體如下:
<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
        想使用不同版本的JDK
<!-- 使用 java 1.8 -->
<java.version>1.8</java.version>
  2、不繼承 spring-boot-starter-parent : 這種情況下,仍然可以使用dependency management,但不能使用plugin management啦。方式如下: 複製程式碼
<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.4.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
複製程式碼 注意,scope是  import 。而且,這種情況下,不再允許在<properties>覆蓋相應的版本。如果要使用其他版本,需要在上面的前面新增一個完整的dependency。如下: 複製程式碼
<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.4.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
複製程式碼

 

另外,Spring Boot還提供了一個Maven Plugin:spring-boot-maven-plugin,用於將專案打包成fat jar(executable jar)。 繼承時只需要 宣告一下即可使用: 複製程式碼
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
複製程式碼

 

六、Starters 可以建立自己的Starter,但名字格式不能是 spring-boot-starter-*,而是 *-spring-boot-starter。類似Maven外掛的規則。   七、自動配置 @Import 和 @ComponentScan 類似; @EnableAutoConfiguration 和 @SpringBootApplication 類似;---注意,只能使用一次,建議用在primary @Configuration class上。   注意,自動配置永遠是第二位的,一旦你配置自己的東西,那自動配置的就會被覆蓋。 檢視自動配置都配置了什麼,以及為什麼,啟動應用的時候加上 --debug即可。 禁用特定的自動配置: 複製程式碼
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
複製程式碼 如果class不在classpath中,可以使用  excludeName,然後使用 全路徑即可。   八、Spring Beans 和 依賴注入。 九、@SpringBootApplication @SpringBootApplication 等同於預設的屬性的  @Configuration@EnableAutoConfiguration  and @ComponentScan。  -- 注意,@ComponentScan 不能憑空使用。    十、執行Spring Boot Application 1、從IDE中執行 需要匯入現有Maven專案。 如果不小心運行了兩次,出現端口占用問題,STS(Spring Tools Suite)使用Relaunch即可。   2、執行fat jar(executable jar) java -jar target/xxxx.jar    注意,是在專案路徑下執行。 開啟 遠端除錯支援
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myproject-0.0.1-SNAPSHOT.jar

 

3、使用Maven Plugin
  1. mvn spring-boot:run
4、Hot swapping   熱部署??? 好像不是,是熱載入。 因為Spring Boot應用都是簡單的Java應用,所以JVM Hot-swapping可以直接使用。但是,JVM Hot-swapping對於能夠替換的位元組碼有些限制,所以建議使用JRebel或者Spring Loaded?? spring-boot-devtools 模組同樣包含了快速重啟應用的支援。 另外,貌似JVM Hot-swapping 只能在debug期間修改方法體??       十一、Developer tools Spring Boot包含一組附加的開發期工具。 複製程式碼
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
複製程式碼 注意,生產環境下(java -jar或者通過特定的類載入器啟動),這些開發工具自動被禁止。 上面的  <optional>true</optional> 是一個最佳實踐,可以有效阻止用於其他模組。 如果想確保生產Build中不包含devtools,可以使用excludeDevtools build property。   1、Property defaults 一些Spring Boot支援的庫使用了cache增進效能。但是cache,在開發過程中可能會是一個阻礙。例如你無法立即更新一個模板(thymeleaf的)。 cache設定通常在 application.properties 中。但是,比起手動設定這些,spring-boot-devtools模組會自動應用這些開發期的設定。   2、自動重啟 使用spring-boot-devtools模組的應用,當classpath中的檔案有改變時,會自動重啟! -- 就是說,預設會監視classpath入口。 靜態資源和檢視模板不需要重啟! 注意,不同的IDE有不同的表現,例如Eclipse中只要改變了檔案並儲存,那就會導致classpath中的內容改變。而Intellij IDEA則需要 Build #Make Project。 可以通過build plugin啟動應用,只要開啟了forking支援,因為Devtools需要一個隔離的classloader才能執行正常。Maven下要這樣開啟: 複製程式碼
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>
複製程式碼 注意:在使用LiveReload(熱載入)時,自動重啟仍然可以正常工作。如果你使用了JRebel,自動重啟會被禁用以支援動態類載入。此時,devtools其他方面仍然可以使用。 注意:DevTools在重啟過程中依賴應用上下文的shutdown hook來關掉它(應用)。所以如果禁用了shutdown hook,它就無法正常工作了:SpringApplication.setRegisterShutdownHook(false)。   Spring Boot使用的重啟技術,實際上是使用了兩個類載入器:不變的base類載入器、可變的restart類載入器。前者載入第三方jar之類的。後者載入專案程式碼。重啟的時候,只是丟棄可變的restart類載入器,然後重新建立一個,所以速度比較快。 如果你覺得這樣仍然不夠快,或者遇到了類載入器問題,那你可以考慮JRebel之類的重載入技術。(重寫了類??) Spring Loaded專案提供了另一個選擇,但是支援的框架不夠多,且沒有商業支援。   一些特定的資源改變時沒有必要引起重啟。有一些不會引起重啟,但是會重載入。如果你想自定義的設定一下,可以使用  spring.devtools.restart.exclude 屬性。如下:
spring.devtools.restart.exclude=static/**,public/**
如果想在預設的設定之外 再新增新的排除選項,可以使用  spring.devtools.restart.additional-exclude 屬性。   如果想在修改classpath之外的檔案時也讓應用重啟,可以使用 spring.devtools.restart.additional-paths 屬性。還可以配合上面提到的  spring.devtools.restart.exclude 屬性,來控制是重啟還是重載入。   如果不想使用自動重啟功能,可以使用  spring.devtools.restart.enabled 屬性。多數情況下,可以在 application.properties 中設定,這樣 仍然會建立一個restart類載入器,但不再監視改變。 如果想完全禁止自動重啟,需要在呼叫  SpringApplication.run(..) 之前設定一個System屬性。如下:
public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}
  如果你的IDE會隨改隨編譯,你可能會傾向於只在特定時刻引發重啟(否則會很煩人,而且效能下降)。這時,你可以使用“trigger file”,就是一個特定的檔案,只有修改這個檔案時才會觸發重啟。使用  spring.devtools.restart.trigger-file 屬性即可。(還可以設定為全域性屬性,這樣所有的專案都可以使用了!見十八。)   自定義restart類載入器。 如果有一個多模組專案,只有部分匯入到你的IDE中,你可能需要自定義一下。首先建立一個檔案:META-INF/spring-devtools.properties。該檔案中,可以有以字首  restart.exclude. 和  restart.include. 開頭的屬性。前者會被放入base類載入器,後者則被放入restart類載入器。 該屬性的value,是正則表示式。例如:
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
注意,key只要是字首 restart.exclude. 和 restart.include. 開頭即可, 字尾任意。   已知限制:

相關推薦

springboot注意補充

個人說明:本文內容都是從為知筆記上覆制過來的,樣式難免走樣,以後再修改吧。另外,本文可以看作官方文件的選擇性的翻譯(大部分),以及個人使用經驗及問題。 其他說明: 如果對Spring Boot沒有概念,請先移步上一篇文章 Spring Boot 學習。本篇原本是為了深

springbootspring cache

Spring Cache Spring Cache使用方法與Spring對事務管理的配置相似。Spring Cache的核心就是對某個方法進行快取,其實質就是快取該方法的返回結果,並把方法引數和結果用鍵值對的方式存放到快取中,當再次呼叫該方法使用相應的引數時,就會直接從快取裡

springbootredis

目錄 redis連線工廠類  template(模版) key和value序列化 springboot快取某個方法 申明快取管理器 新增快取 刪除快取 自定義ke

SpringBootlogback日誌使用注意事項

springboot預設的日誌配置:logback 根節點:   <configuration /> 主要子節點:   <appender />:配置日誌輸出的方式,控制檯,檔案等。   <logger />、&l

SpringBoot值得注意的事

在spring-boot-*包中,有一部分裡面並沒有class檔案,只有一個META-INF/MANIFEST.MF,這個這些jar的真正作用是引入spring等核心的jar包。 當然spring-boot-autoconfigure-*.jar等少數幾個springboot核心的jar有cla

Springboot元件體系

 Springboot與第三方整合  spring-boot-starter 核心啟動器,包括自動配置支援,日誌記錄和YAML spring-boot-starter-activemq

SpringBoot應用打包

springboot可以是web專案也可以是普通java專案。對於普通框架而言如果是web專案,需要在tomcat等web容器中執行。但是springboot可以脫離web容器執行,這並不是真正意義上的脫離web容器執行,只是將web容器以jar包的方式融入專案中讓專案能夠以jar方式去執行。

SpringBoot專案部署到外部Tomcat

springboot的優點就在於整合使用,約定優於配置。打war包部署外部tomcat瞭解即可。 1、開啟pom檔案,把打包格式設定為war       <packaging>war</packaging> 2、在pom檔案

SpringBootJSP使用

官方不推薦使用jsp作為前端頁面開發,jar包專案不支援jsp使用,jsp需要執行在servletContext中,war包需要執行在server伺服器中如tomcat;官方推薦使用thymeleaf,freemarker等模版引擎。這裡僅作為了解。 1、建立一個maven且web專案,新增po

sql的執行順序,連線注意

select date(oi.pay_time) as event_date, count(distinct oi.device_id) as uv, count(*) as order_total, (select plat

高效能javascript讀書筆記注意

1.避免雙重求值      允許傳人另一段javascript程式碼字串並執行的四種方法:      eval()、Function()建構函式、setTimeout()和setInterval()      當在javascript程式碼中執行另一段javascript程

nginx+php+mysql+vsftp伺服器注意

一.nginx的啟動 在 Unix-like 系統上, 非 root 使用者只能使用 1024 之上的埠。所以, 預設的 80 埠就無效了。網上查了下主要有兩種方法,一種是利用埠對映nginx配置如8080埠,同時將80埠影射到8080上,還有一種辦法是直接通過80埠啟

『中級篇』dockerjava容器執行springboot-jar(篇)(79)

學了docker這麼久終於開始實戰了,所有部署方式全部使用docker的方式感覺特別爽,我這裡分享下,我部署springboot的富jar包。 下載java的映象 docker pull java:openjdk-8 spring boot 打包後的富jar 放入指定的目錄。

『中級篇』dockerjava容器運行springboot-jar(篇)(79)

可選 執行 class doc 全部 -a Language -bash ans 學了docker這麽久終於開始實戰了,所有部署方式全部使用docker的方式感覺特別爽,我這裏分享下,我部署springboot的富jar包。 下載java的鏡像 docker pull j

人工智慧基礎(高中版)教材補充和資源分享篇 Cozmo+Python+ROS+AI

Cozmo+Python+ROS+AI會產生什麼樣的奇妙反應呢? (玩Cozmo機器人,學Python程式設計,掌握ROS和AI技術) 跟隨綠色鐳射點運動?如何實現? 在黃色邊緣線的賽道上行駛?如何實現? 這是一篇輕鬆愉快的博文,簡單聊聊如何從玩機器人,升

糧草先行——Android折疊屏開發技術運行時變更處理原則

ret 橫豎屏 public 根據 情況 http 重啟 瓶頸 屏幕方向 上一篇文章中,我們有提到Activity在屏幕尺寸發生變更時的處理方式,總共有兩種: 重啟APP以適應屏幕改變; 手動處理數據,避免APP重啟。 同樣,這兩種方式也同時適用於改變屏幕方向、更改系統

Springboot原始碼分析

摘要: 大家都知道註解是實現了java.lang.annotation.Annotation介面,眼見為實,耳聽為虛,有時候眼見也不一定是真實的。 /** * The common interface extended by all annotation types. Note that

Android開發漫漫長途 篇——自定義View的各種姿勢2

是個 pub water 常用 getchild mod one 它的 sdn 該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷

Android開發漫漫長途 篇——內存泄漏分析與解決

set 程序 靜態 內存 ins clas back undle 介紹 該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷Ⅰ,Ⅱ,

前端基於react,後端基於.net core2.0的開發路(篇) 後端使用T4模板,生成某些類

bsp 。。 bubuko 按鈕 uil out eva 下載地址 所有 1.介紹 因為開發過程中,有部分類是你加一個模型,就需要去改動的,每次加非常的煩,或者有些類,你只用到了他基類的方法,但是你還必須建一個文件才能調用他基類的方法,也很煩。 這個時候,T4就非常有用了。