1. 程式人生 > >Spring Boot 2.x 快速入門(下)HelloWorld示例詳解

Spring Boot 2.x 快速入門(下)HelloWorld示例詳解

esc 入門 無敵 depend alt 簡單的 net 自動管理 clean

上篇 Spring Boot 2.x 快速入門(上)HelloWorld示例 進行了Sprint Boot的快速入門,以實際的示例代碼來練手,總比光看書要強很多嘛,最好的就是邊看、邊寫、邊記、邊展示。就是把看到的使用IDE工具進行實際的代碼演練,在把演練過程寫出來,最後發表在blog或其他自媒體平臺。

本篇主要以上篇的代碼為準,說明HelloWorld示例代碼中的註意事項。相對於微軟的Net Core,Spring Boot 功能點更加清晰、易於記憶與應用。本篇主要涉及到

1.什麽什麽樣的開發工具

2.pom.xml配置說明

3.示例中的代碼註解含義

4.如何打包和其他的打包方式

5.熱部署

1.開發工具的選擇

除了全宇宙無敵的Visual Studio外,推薦Intellij IDEA,Intellij IDEA可能是Java中最好的開發者工具。可選Intellij IDEA是收費的,而且還小貴。大家學習用,可以用試用版本。也可以選擇Eclipse和Visual Studio Code來替代。本示例HelloWorld使用的IDEA來開發。

1.1 IDEA

IDEA如何運行Java項目,如何創建和編譯運行Spring Boot項目在上一篇( Spring Boot 2.x 快速入門(上)HelloWorld示例)已經演示過。

1.2 Eclipse

開源,但是要自己設置的比較多,我之前是編寫NET代碼,有的時候也用,當初Android Studio也是選擇的Eclipse,但是後來轉戰Intellij IDEA了,說明啥,對用戶友好的還是Intellij IDEA

1.3 Visual Studio Code

近年來,vs code逐漸流行,並且有迅速擴大的態勢。高效、簡單、使用,是他的基本特點。我比較看好VS Code,簡單精致,有無限可能。

2.Maven以及他的Pom.xml配置

在https://start.spring.io/ 的網站上可以看到,除了使用Maven外,我們還可以使用 Gradle Project

來管理 SpringBoot 項目。我目前使用Maven來管理Spring Boot,Android Studio則默認使用 Gradle Project 來管理項目。

2.1 Maven 簡介

第一次使用Maven,感覺跟Net的Nuget包管理器是一樣的。是對第三方組件(類似Dll)Java中是Jar包的管理,可以自動管理他們的加載與卸載。

在沒有Maven的時候,我們可以通過 添加第三方包來向項目增加Jar包,這種方式jar很少的時候,非常方便,但多了之後非常的麻煩,特別是團隊作業的時候。

所以我的理解是,Maven感覺就是一個智能機器人,我們把對Jar包的管理托管給他,由他來管理包的加載、匹配、卸載等工作。

2.2 Pom.xml配置文件

Pom.xml是Maven的配置文件,這個類似NodeJs使用json文件來管理、ASP.NET 來使用web.config來管理一樣,Pom.xml是Maven管理第三方Jar包的可描述的文件。

實際操作過程中,我們只要對Pom.xml進行變更,系統就會自動去管理jar包。

上一張的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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.fishpro</groupId>
	<artifactId>springstudy</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springstudy</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

  

上面幾個核心的節點說明
1、modelVersion
  指定了當前Maven模型的版本號,對於Maven2和Maven3來說,它只能是4.0.0

2、groupId
  組織名稱,通常使用com.companyname.xx.xx (或使用net 、org開頭)中間使用.(點)號隔開。

3、artifactId
  項目名稱項目唯一的ID,一個groupId下可能有多個項目,靠artifactId區分,比如springstudy項目

4、version
  版本號,SNAPSHOT意為快照,說明該項目還在開發中,是不穩定的版本。在Maven中很重要的一點是,groupId、artifactId、version三個元素生成了一個Maven項目的基本坐標。

5、dependencies

  依賴項管理節點,所有的依賴都是使用這個節點管理的, 每個依賴節點由包括了groupId(必選)、artifactId(必選)、version(可選),註意這裏的groupId-artifactiD-version組成了唯一的識別號,也就是前面的節點的意義所在

6、build

  表示與構建相關,如在本章的 5熱部署中需要配置build下的plugins配置,以達到支持熱部署的效果。

Maven的Pom.xml配置項目很多,但實際上操作過程用的最多的就是依賴 的增加減少 dependencies 操作。

3.註解-編碼的核心

在Spring Boot中正是靠註解來大大簡化編程代碼,在Spring Boot代碼中隨處可見註解,包括 @SpringBootApplication、@Autowired、@Bean、@Component等等,下面列出HelloWorld中的常見註解

3.1 @SpringBootApplication

申明讓spring boot自動給程序進行必要的配置,這個配置等同於:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三個配置。

在啟動類文件 com.fishpro.springstudy.SpringstudyApplication 中,@SpringBootApplication在文件開頭上。

@SpringBootApplication
public class SpringstudyApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringstudyApplication.class, args);
	}

}

  

按住ctrl 點擊 @SpringBootApplication可以放心它是有三個註解組成

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

  

3.2 @RestController

com.fishpro.springstudy.controller.HelloWorldController.java中用於標註控制層組件(在MVC中的Controller層),@ResponseBody和@Controller的合集。

按住Ctrl鍵 點擊@RestController 可以看到他是@Controller和@ResponseBody集合

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

  

3.3 @RequestMapping

提供路由信息,負責URL到Controller中的具體函數的映射。類似C#中的[Route("hello/[controller]/[action]")]

@RequestMapping是@Mapping的擴展

有了這些註解,HelloWorld示例程序就可以運行了。不僅僅在簡單的RestApi中可以使用註解,在SpringBoot所有的特征功能中,都使用了註解。

總的來說,註解是一種AOP形態,類似於C#中的特性。類似一種標記,大大簡化了代碼的編寫量。在後面會有單獨一章講解註解。

4.打包發布

4.1 使用內置的Tomcat來打包

在HelloWorld示例中,我們使用了內置的Tomcat來打包Spring Boot程序。這也是官方默認的打包方式,用起來也是非常方便。

無須其他的配置,直接編譯,項目中的mvnwmvnw.cmd文件是對mvn命令的封裝。通常使用以下命令來編譯

mvn clean
mvn install

4.2 打包成War

war可以在獨立的Tomcat服務器中部署。

修改Pom.xml

<groupId>com.fishpro</groupId>
<artifactId>springstudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springstudy</name>
<packaging>war</packaging>

使用命令  


mvn clean mvn install

打包成war

 

技術分享圖片

把war放到tomcat服務器的webapps文件夾下,在tomcat運行時會自動將war解壓的webapps下

  

5.熱部署

熱部署,就是當我們修改源代碼或資源文件的時候,委托系統自動重啟tomcat應用,這樣,我們開發人員就不需要頻發的手動操作。

下面以IDEA環境為例子說明

5.1 在IDEA設置中配置系統支持熱部署

點擊 Preferences>Build,Execution,Deployment>Compiler ,勾選 Build project automatically

技術分享圖片

並按住 ctrl+shift+alt+/ 組合鍵打開面板 Maintenance,點擊Registry...

技術分享圖片

勾選 Compiler autoMake allow when app running

5.2 配置Pom.xml,引入熱部署插件

引入插件

<!--Spring Boot 2.x 快速入門(下)HelloWorld示例詳解中的熱部署插件-->
<!--添加熱部署-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
	<scope>true</scope>
</dependency>

  

修改build>plugins節點

<build>
	<plugins>
		<plugin>
			<!--熱部署配置-->
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<!--fork:如果沒有該項配置,整個devtools不會起作用-->
				<fork>true</fork>
			</configuration>
		</plugin>
	</plugins>
</build>

5.3 運行測試熱部署效果

1)運行HelloWorld項目,瀏覽器輸入 http://localhost:8999/hello/say 可以看到輸出 HelloWorld

2)修改com.fishpro.springstudy.controller.HelloWorldController.java 如下,增加輸出字符串

public class HelloWorldController {
    @RequestMapping("/say")
    public String say(){
        return "HelloWorld"+" 熱部署測試";
    }
}

3)瀏覽器輸入 http://localhost:8999/hello/say 可以看到輸出 HelloWorld 熱部署測試。同時我們可以看到IDEA的Console(IDEA下面的窗口)系統自動重啟了項目。效果如下圖:

  

技術分享圖片

問題

1.經常我們部署了熱部署,在Pom中加入了依賴xml描述,但是沒有什麽效果,問題在於,我們未能配置IDEA的環境,註意是兩個環境設置(見5.1)。

參考

http://www.runoob.com/maven/maven-pom.html (maven)

https://blog.csdn.net/weixin_40753536/article/details/81285046 (註解)

https://blog.csdn.net/qq_42685050/article/details/81588584 (熱部署)

Spring Boot 2.x 快速入門(下)HelloWorld示例詳解