SpringBoot之旅第一篇-初探

1、SpringBoot是什麼?

微服務,應該是近年來最火的概念,愈來愈多的公司開始使用微服務架構,面試中被問到的微服務的機率很高,無論對技術的追求,仍是爲了進更好的公司,微服務都是咱們開發人員的必需要學習的知識。html

那麼微服務到底是什麼呢?java

咱們通俗的理解方式就是:微服務化的核心就是將傳統的一站式應用,根據業務拆分紅一個一個的服務,完全 地去耦合,每個微服務提供單個業務功能的服務,一個服務作一件事,從技術角度看就是一種小而獨立的處理過程,相似進程概念,可以自行單獨啓動或銷燬,擁有本身獨立的數據庫。web

想要更好的瞭解微服務概念的同窗能夠去看看這篇論文:https://martinfowler.com/articles/microservices.html面試

dubbo和springcloudspring

目前比較成熟的微服務架構有兩種:dubbo和springcloud,這兩種技術各有優劣,他們最大的區別是:SpringCloud拋棄了Dubbo的RPC通訊,採用的是基於HTTP的REST方式數據庫

爲什麼會選擇springcloud,主要是從兩個方面考慮:瀏覽器

  1. spring全家桶:做爲Spring的拳頭項目,springcloud可以與Spring Framework、Spring Boot、Spring Data、Spring Batch等其餘Spring項目完美融合,並且springcloud有一整套的微服務架構解決方案,你能夠很放心的使用,你們都愛全家桶。springboot

  2. 社區支持與更新力度:DUBBO中止了5年左右的更新,雖然2017.7重啓了,可是影響仍是有一些的。架構

固然,這只是一種技術選擇,不須要去爭論。app

講了這麼多,尚未說到主題,那springboot又是什麼?SpringBoot專一於快速方便的開發單個個體微服務,SpringBoot能夠離開SpringCloud獨立使用開發項目,可是SpringCloud離不開SpringBoot,屬於依賴的關係,SpringBoot專一於快速、方便的開發單個微服務個體,SpringCloud關注全局的服務治理框架。

要學習springcloud,就必須先學習springboot。

2、SpringBoot的優點

Spring Boot是來簡化Spring應用開發,約定大於配置,去繁從簡,just run就能建立一個獨立的,產品級別的應用,多數Spring Boot應用須要不多的Spring配置。

用過spring開發就知道,spring配置繁多、開發效率低下、部署流程複雜、且第三方技術集成難度大。而使用springboot有以下優點:

一、快速建立獨立運行的Spring項目以及與主流框架集成。 

二、使用嵌入式的Servlet容器,應用無需打成WAR包 。

三、starters自動依賴與版本控制 。

四、大量的自動配置,簡化開發,也可修改默認值。

五、 無需配置XML,無代碼生成,開箱即用。

六、準生產環境的運行時應用監控。

七、與雲計算的自然集成。

學習spring是有必定前提的,spring,maven都必須先掌握

3、hello world

相信大部分開發如今都是使用idea,關於idea的maven配置就不講了,咱們開始第一個springboot項目

新建項目:

下一步:

下一步:

下一步:

只勾選web,這裏咱們就構建成功了,再刪除一些沒必要要的文件,最終結構:

新建一個controller:

代碼:

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        return "hello world";
    }
}

啓動項目:

成功後,瀏覽器中輸入:http://localhost:8080/hello

結果就出來了,簡直太方便了,springboot不只開發簡單,部署也很是容易,直接打包

打包後的文件:

複製到桌面,而後直接執行命令 java -jar

刷新剛剛的地址,成功顯示,就已經部署完成。

4、原理探究

咱們先簡單的探究下其中的原理,首先咱們看pom包

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

進入依賴,發現他還有一個父依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

在父依賴中咱們能夠看到裏面對組件的版本號進行了寫入:

咱們默認是不須要寫版本的,固然,沒有在裏面的依賴須要咱們定義,這就是springboot的版本仲裁中心

再看另外的一個依賴:

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

這個依賴能夠分爲兩個部分:spring-boot-starter說明這個是spring-boot場景啓動器,然後面的web會幫咱們導入了web模塊正常運行所依賴的組件,如:

Spring Boot將全部的功能場景都抽取出來,作成一個個的starters(啓動器),只須要在項目裏面引入這些starter相關場景的全部依賴都會導入進來。要用什麼功能就導入什麼場景的啓動器。

咱們在看看主程序類

@SpringBootApplication //來標註一個主程序類,說明這是一個Spring Boot應用
public class SpringbootLearnApplication {

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

@SpringBootApplication: Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啓動SpringBoot應用,進入其中

@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 {

這裏面有個@SpringBootConfiguration: 翻譯過來是Spring Boot的配置類,標註在某個類上,就表示這是一個Spring Boot的配置類。

咱們再進入其中,又能夠看到一個註解@Configuration: 翻譯過來是配置類,上面標註這個註解說明這是一個配置類,至關於一個配置文件,配置類也是容器中的一個組件至關於@Component。

還有一個@EnableAutoConfiguration 這個註解說明開啓自動配置功能。這就是爲何咱們不須要寫任何配置,就能夠起項目的緣由,之前咱們須要配置的東西,Spring Boot幫咱們自動配置;@EnableAutoConfiguration告訴SpringBoot開啓自動配置功能,這樣自動配置才能生效。

咱們不妨再進入到這個註解中:

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

這裏面@AutoConfigurationPackage ,翻譯過來就是自動配置包,咱們再到裏面去看看,又有一個註解

@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}

這個註解咱們就比較熟悉了,@Import 這個註解是給容器中導入一個組件;導入的組件由Registrar.class,這個 Registrar.class中的方法的就是將所在包及下面全部子包裏面的全部組件掃描到Spring容器。

這個要注意必須是其子包,若是咱們放在外面將不能被掃描,用個例子說明,假設咱們在java路徑下增長一個類,

@Controller
public class HelloWorld {
    @ResponseBody
    @RequestMapping("/world")
    public String world(){
        return "hello world";
    }
}

 再次啓動,是找不到這個地址的,由於這個包沒有掃入其中,這樣咱們就明白了包是怎麼掃描進去的。

下面咱們再到@EnableAutoConfiguration 找到@Import({AutoConfigurationImportSelector.class}),

EnableAutoConfigurationImportSelector 翻譯過來是導入哪些組件的選擇器,這個類的做用是:將全部須要導入的組件以全類名的方式返回,這些組件就會被添加到容器中。

public String[] selectImports(AnnotationMetadata annotationMetadata) {

這個方法會給容器中導入很是多的自動配置類(xxxAutoConfiguration),就是給容器中導入這個場景須要的全部組件,並配置好這些組件。

這樣咱們就知道自動配置類是如何導入的,有了自動配置類,免去了咱們手動編寫配置注入功能組件等的工做。

去看這個文件,發現裏面有大量的註解配置類:

Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值做爲自動配置類導入到容器中,自動配置類就生效,幫咱們進行自動配置工做,之前咱們須要本身配置的東西,自動配置類都幫咱們。

這樣咱們就對springboot的原理有個大體的瞭解,最重要的是springboot將咱們以前要作的不少事情都作好了。

相關文章
相關標籤/搜索