Spring Boot-入門

Java 企業級開發,經歷了從 SSH (Spring + Struts2 + Hibernate)到 SSM(Spring + StringMVC + MyBatis)再到 Spring 全家桶(Spring + Spring Boot + SpringData + Spring Cloud 等)的過程。總之,代碼的封裝程度愈來愈高,開發的複雜度也在愈來愈低。html

Spring 全家桶的底層基礎都是 Spring 框架,一般能夠分爲兩類:前端

  • Java 企業級開發:Spring Boot
  • Java 分佈式應用:Spring Cloud

Spring Boot 概述

Spring Boot 能夠一站式實現 J2EE 企業級開發。vue

Spring Boot 用來簡化 Spring 應用的開發,採用「約定大於配置」的原則,省去了大量複雜的配置,能夠方便快速的建立一個企業級應用。java

Spring Boot 自己是基於 Spring 的,相似於前端框架 Vue 所使用的 vue-cli,快速建立獨立的企業級應用。web

Spring Boot 的特色:redis

  • 嵌入了 Servlet 容器,應用無需打包
  • 提早封裝好了各類依賴對應的 starter
  • 默認配置,簡化開發,配置能夠修改
  • 不用配置 XML,不會生成代碼,各類寫好的 API 開箱即用
  • 運行時的應用監控,能夠監控服務狀態

由於 Spring Boot 是基於 Spring 框架的二次封裝,若是你不瞭解 Spring 框架的一些底層原理,則在輕鬆入門後,難以精通。spring

單體應用和微服務

Spring Boot 的誕生背景就是微服務的大潮流,這裏先大概提一下微服務這個概念。vue-cli

微服務概念流行以前,大部分應用都是單體應用。單體應用將全部代碼耦合到一個項目中,經過命名空間或直接引入類文件實現類的調用。在項目初期比較小的時候,這種開發方式效率高、部署容易、測試方便、易於實現負載均衡(水平擴容)。可是發展到必定規模後,會出現牽一髮而動全身的問題,各類依賴關係耦合複雜,難以實現新需求,難以修改。json

微服務將應用的每個模塊獨立爲一個服務,服務之間經過 RPC 或 HTTP 方式實現相互調用,從而實現解耦,方便實現各個微服務的獨立擴容。一般會有一個網關對外提供統一的服務入口。瀏覽器

Spring Boot 的 HelloWorld 項目(基於 IDEA)

在 Spring 官網 http://spring.io/ 能夠找到各類相關的資源。HelloWorld 示例能夠參考:http://spring.io/guides/gs/actuator-service/

建立 Maven 工程

在 Intellij IDEA 中選擇 File-》New Project-》Maven,建立 Maven 類型的項目,選擇合適的SDK 版本後,點擊下一步,輸入 GroupId(例如com.baid)和 ArtifactId(例如 spring_boot_demo,IDEA 不支持中橫線),點擊下一步選擇項目的位置(默認在 C 盤),而後 Finish 完成便可。

項目初始化完成後,IDEA 右下角會彈出「Maven project need to be imported」彈出,選擇「Enable Auto-Import」 便可。這樣當你更新了 Maven 項目的 pom.xml 文件時,IDEA 會自動獲取依賴。

導入 Spring Boot 的依賴

到這裏,Maven 項目就建立完成了,接下來只須要添加 Spring Boot 依賴便可,複製下面的文本到項目根目錄中的 pom.xml 文件的 project 標籤下便可:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <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>
        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

編寫 Java 代碼

編寫主程序啓動 Spring Boot 應用

在 IDEA 中展開剛纔建立的項目的代碼目錄,在 /src/main/java 目錄右擊,建立新的 Java class,輸入「com.kikakika.SpringBootApplication」這種方式,能夠自動建立包和類,而後編輯類:

package com.kikakika;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/** * 經過註解標註這是一個 Spring Boot 主程序類 */
@SpringBootApplication
public class HelloWorldMainApplication {

    // 啓動 Spring Boot 應用程序
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

編寫 Controller

右擊 com.kikakika 包名,建立新的 Java class,輸入 controller.HelloController,在 com.kikakika.controller 包下面建立 HelloController 類:

package com.kikakika.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping
    public String Hello() {
        return "Hello World!!";
    }
}

啓動 Spring Boot

回到 SpringBootApplication 文件,右擊,運行便可啓動這個 Java 應用。控制檯會打印啓動日誌,注意看對應的 Tomcat 端口,通常是 8080:

2019-01-01 12:27:20.100  INFO 12380 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-01-01 12:27:20.154  INFO 12380 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-01-01 12:27:20.160  INFO 12380 --- [           main] com.kikakika.HelloWorldMainApplication   : Started HelloWorldMainApplication in 5.598 seconds (JVM running for 8.007)

在瀏覽器中訪問localhost:8080/hello查看效果。

打包部署 Spring Boot 應用

參考:https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html

首先將 Spring Boot 的用於建立可執行 Jar 文件的 Maven 插件導入項目中:

<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>2.1.1.RELEASE</version>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

而後,打包。
Maven 打包 Spring Boot 項目
打包完成後,整個項目,包括 Tomcat 都會被打到一個 Jar 包中,通常放在項目根目錄下的 target 目錄中,能夠直接經過 java -jar 命令運行便可。

C:\Users\kika\Desktop>java -jar spring_boot_demo-1.0-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.5.RELEASE)

2019-01-01 12:50:36.293  INFO 10096 --- [           main] com.kikakika.HelloWorldMainApplication   : Starting HelloWorldMainApplication v1.0-SNAPSHOT on DESKTOP-QDO2CMR with PID 10096 (C:\Users\kika\Desktop\spring_boot_demo-1.0-SNAPSHOT.jar started by kika in C:\Users\kika\Desktop)
2019-01-01 12:50:36.301  INFO 10096 --- [           main] com.kikakika.HelloWorldMainApplication   : No active profile set, falling back to default profiles: default
2019-01-01 12:50:36.447  INFO 10096 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6d1e7682: startup date [Tue Jan 01 12:50:36 CST 2019]; root of context hierarchy

經過瀏覽器訪問便可,效果跟在 IDEA 中啓動應用同樣。

Spring Boot 的一點點原理

啓動器

在項目根目錄下的 pom.xml 文件中,能夠看到 artifactId 以 spring-boot-starter- 開頭的各類項目,無論是在 parent 父項目標籤仍是 dependencies 依賴標籤中。這些項目,就是各類場景下的啓動器,每一個啓動器都內置了完整的依賴。

Spring 提早爲咱們封裝了各類場景下的啓動器,例如針對 ActiveMQ 的 spring-boot-starter-activemq,針對 AOP 的 spring-boot-starter-aop,針對使用 Hibernate 的 Spring Data JPA 的 spring-boot-starter-data-jpa,針對 Redis 的 spring-boot-starter-data-redis,針對郵件的 spring-boot-starter-mail 等。使用的時候,只須要當作依賴導入便可。

例如 web 開發所用到的 spring-boot-starter-web 項目的依賴關係以下:

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.0.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.0.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.0.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.12.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.9.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

@SpringBootApplication 註解及相關注解

全部的 Spring Boot 入口類必須添加 @SpringBootApplication 註解,表示這是一個 Spring Boot 應用程序。

按住 Ctrl 後點擊 SpringBootApplication 註解,能夠查看註解的定義。能夠看到這個註解有引入了一堆其餘註解,其中有個 EnableAutoConfiguration 註解,繼續深刻能夠發現 EnableAutoConfiguration 註解又引入了另外一堆註解,其中有 @AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})

@AutoConfigurationPackage 註解

查看這個註解的定義時,能夠發現其引入了 @Import({Registrar.class}) 註解,進入到 Registrar 類對應代碼,在下面這一行加斷點:

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }

Spring Boot 斷點查看配置
在 getPackageName 方法上右擊,選擇「Evaluate Expression」,查看對應信息,這裏會顯示加 @SpringBootApplication 的類所在的包:
IDEA 計算表達式

綜上,Spring Boot 將主配置類(即便用 @SpringBootApplication 註解標註的類)所在的包及其子包下的全部組件都掃描到 Spring 容器。

@Import({AutoConfigurationImportSelector.class}) 註解

EnableAutoConfiguration 註解中,還引入了 @Import({AutoConfigurationImportSelector.class}) 這個註解。

自定義依賴

最終,全部自動加載的依賴,都來自 Maven 倉庫中的 Jar 包指定,若是須要修改,能夠直接改這裏:repository/org/springframework/boot/spring-boot-autoconfigure/2.0.5.RELEASE/spring-boot-autoconfigure-2.0.5.RELEASE.jar!/META-INF/spring.factories

用 IDEA 快速建立 Spring Boot 項目

Spring Boot 太流行了,因此各個版本的 IDE 都內置了建立 Spring Boot 項目的快速方式。對於 IDEA,在建立項目 project 時,能夠選擇建立 「Spring Initialize」 項目,IDEA 會在建立項目時提示你導入各類 Starter 啓動器,以後便自動導入依賴。

快速建立 Spring Boot 項目

選擇啓動器(依賴)

相關文章
相關標籤/搜索