springboot番外之注意點補充
個人說明:本文內容都是從為知筆記上覆制過來的,樣式難免走樣,以後再修改吧。另外,本文可以看作官方文件的選擇性的翻譯(大部分),以及個人使用經驗及問題。
其他說明: 如果對Spring Boot沒有概念,請先移步上一篇文章 Spring Boot 學習。本篇原本是為了深入瞭解下Spring Boot而出現的。 另外,Spring Boot 仍然是基於Spring的,建議在趕完工之後深入學習下Spring,有興趣可以看看我的 Spring 4 官方文件學習(十一)Web MVC 框架 。歡迎探討,笑~目錄:
- 內建Servlet Container
- 使用Spring Boot
- 安裝Spring Boot CLI
- 開發一個簡單的Spring Boot應用--使用最原始的方式
- Dependency Management
- 自動配置
- Spring Beans 和 依賴注入(略)
- @SpringBootApplication
- 執行Spring Boot Application
- Developer tools
- 生產打包
一、內建Servlet Container:
二、使用Spring Boot。 你可以像使用標準的Java庫檔案一樣使用Spring Boot。簡單的將需要的 spring-boot-*.jar 新增到classpath即可。 Spring Boot不要求任何特殊的工具整合,所以可以使用任何IDE,甚至文字編輯器。 只是,仍然建議使用build工具:Maven 或 Gradle。 Spring Boot依賴 使用此外,你仍然可以部署Spring Boot專案到任何相容Servlet3.0+的容器。
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+
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
mvn spring-boot:run
<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 學習。本篇原本是為了深
springboot番外之spring cache
Spring Cache Spring Cache使用方法與Spring對事務管理的配置相似。Spring Cache的核心就是對某個方法進行快取,其實質就是快取該方法的返回結果,並把方法引數和結果用鍵值對的方式存放到快取中,當再次呼叫該方法使用相應的引數時,就會直接從快取裡
springboot番外之redis
目錄 redis連線工廠類 template(模版) key和value序列化 springboot快取某個方法 申明快取管理器 新增快取 刪除快取 自定義ke
SpringBoot番外篇之logback日誌使用注意事項
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檔案
SpringBoot番外篇之JSP使用
官方不推薦使用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埠啟
『中級篇』docker之java容器執行外接springboot-jar(番外篇)(79)
學了docker這麼久終於開始實戰了,所有部署方式全部使用docker的方式感覺特別爽,我這裡分享下,我部署springboot的富jar包。 下載java的映象 docker pull java:openjdk-8 spring boot 打包後的富jar 放入指定的目錄。
『中級篇』docker之java容器運行外置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就非常有用了。