SpringBoot入門篇(一)

簡(jiǎn)介

Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。(這里隨便看看就行)


Springboot中文文檔,相信很多人都需要這個(gè):

http://www.spring-boot.org/doc/pages/using-spring-boot.html


優(yōu)點(diǎn)

快速創(chuàng)建獨(dú)立運(yùn)行的Spring項(xiàng)目以及與主流框架集成

使用嵌入式的Servlet容器,應(yīng)用無(wú)需打成WAR包

starters自動(dòng)依賴與版本控制

大量的自動(dòng)配置,簡(jiǎn)化開發(fā),也可修改默認(rèn)值

無(wú)需配置XML,無(wú)代碼生成,開箱即用

準(zhǔn)生產(chǎn)環(huán)境的運(yùn)行時(shí)應(yīng)用監(jiān)控

與云計(jì)算的天然集成

如果上面看不懂,可以看這里(這是對(duì)新手體驗(yàn)比較明顯的優(yōu)點(diǎn),我也是新手)

1、你需要明白的是SpringBoot是一款優(yōu)秀的框架,集成了很多主流的框架,而且有自動(dòng)配置功能,不需要手動(dòng)編寫配置文件;

2、Springboot可以免除一系列發(fā)布的工作,可以直接生成jar包直接發(fā)布,不需要像Spring那樣打war包,配置tomcat服務(wù)器再進(jìn)行發(fā)布,SpringBoot有內(nèi)置的Tomcat服務(wù)器;


入門

在入門之前,如果你還沒有了解maven這個(gè)東西的話,建議去B站或者學(xué)習(xí)網(wǎng)站去看一些關(guān)于maven的介紹,不需要花太多時(shí)間,大約一個(gè)小時(shí)左右了解一下就可以了,后續(xù)可以繼續(xù)去學(xué)習(xí)maven因?yàn)镾pringBoot也是一個(gè)maven工程。

創(chuàng)建一個(gè)maven工程

1、導(dǎo)入spring boot相關(guān)的依賴(在pom.xml文件中貼入)

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

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

2、編寫一個(gè)主程序;啟動(dòng)Spring Boot應(yīng)用

package cn.clboy.springboot;

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

/**
 * 
 * SpringBootApplication:標(biāo)注一個(gè)主程序類,表示這個(gè)是一個(gè)Springboot應(yīng)用
 */

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) {
        //啟動(dòng)
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

3、編寫一個(gè)controller

package cn.clboy.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 
 * @RestController:是spring4里的新注解,是@ResponseBody和@Controller的縮寫。
 *避免了在每個(gè)api上面都加上一個(gè)@ResponseBody注解
 *具體的可以查閱網(wǎng)上的文章
 */

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello SpringBoot,this is my first Application";
    }
}

  1. 運(yùn)行主程序Main方法測(cè)試

  2. 訪問 localhost:8080/hello

簡(jiǎn)化部署

這里即是上面提到的Springboot的優(yōu)點(diǎn);
1、在pom.xml文件中添加插件

 <!-- 這個(gè)插件,可以將應(yīng)用打包成一個(gè)可執(zhí)行的jar包;-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2、使用mvn package命令進(jìn)行打包或者用idea執(zhí)行mvn package命令


第一種方式,輸入命令之后等待提示 BUILD SUCCESS即打包完成.png
第二種方式.png

3、打包完成之后,在項(xiàng)目路徑下會(huì)出現(xiàn)一個(gè)target的文件夾,其中的便有剛剛打包好的jar包;


image.png
友情提醒:當(dāng)需要進(jìn)行第二次打包之前建議先執(zhí)行命令 mvn clean 清除target文件夾再進(jìn)行第二次的打包,否則可能會(huì)出現(xiàn)問題!

Hello Word項(xiàng)目探究

依賴和啟動(dòng)器就是上面SpringBoot所需要引入的兩段代碼

依賴

<!--父項(xiàng)目

        spring-boot-01-hellword項(xiàng)目依賴于spring-boot-starter-parent這個(gè)父項(xiàng)目,
        spring-boot-starter-parent又繼續(xù)依賴于spring-boot-dependencies這個(gè)父項(xiàng)目

            spring-boot-dependencies:
                他來(lái)真正管理Spring Boot應(yīng)用里面的所有依賴版本;
                也是Spring Boot的版本仲裁中心;
                以后我們導(dǎo)入依賴默認(rèn)是不需要寫版本;(沒有在dependencies里面管理的依賴自然需要聲明版本號(hào))
    -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/>
    </parent>

  

啟動(dòng)器

  <!-- 啟動(dòng)器
    spring-boot-starter-web:
        spring-boot-starter:spring-boot場(chǎng)景啟動(dòng)器;spring-boot-starter-web:幫我們導(dǎo)入了web模塊正常運(yùn)行所依賴的組件;

    Spring Boot將所有的功能場(chǎng)景都抽取出來(lái),做成一個(gè)個(gè)的starters(啟動(dòng)器),
        只需要在項(xiàng)目里面引入這些starter相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來(lái)。要用什么功能就導(dǎo)入什么場(chǎng)景的啟動(dòng)器
        對(duì)應(yīng)幫助文檔 13.5: Starter
       -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

主程序類,主入口類

/***
 * @SpringBootApplication :這個(gè)注解是標(biāo)注一個(gè)主程序類,說(shuō)明這是一個(gè)Springboot應(yīng)用
 */
@SpringBootApplication
public class HellwordApplication {


    public static void main(String[] args) {

        //Spring 應(yīng)用啟動(dòng)
        SpringApplication.run(HellwordApplication.class,args);
    }
}

@SpringBootApplication: Spring Boot應(yīng)用標(biāo)注在某個(gè)類上說(shuō)明這個(gè)類是SpringBoot的主配置類,SpringBoot就應(yīng)該運(yùn)行這個(gè)類的main方法來(lái)啟動(dòng)SpringBoot應(yīng)用;

接下來(lái)解析一下這些注解的作用

1.@SpringBootApplication :注解源碼以及其包含的其他注解

@Target({ElementType.TYPE})    //可以給一個(gè)類型進(jìn)行注解,比如類、接口、枚舉
@Retention(RetentionPolicy.RUNTIME)    //可以保留到程序運(yùn)行的時(shí)候,它會(huì)被加載進(jìn)入到 JVM 中
@Documented    //將注解中的元素包含到 Javadoc 中去。
@Inherited    //繼承,比如A類上有該注解,B類繼承A類,B類就也擁有該注解

@SpringBootConfiguration

@EnableAutoConfiguration

/*
*創(chuàng)建一個(gè)配置類,在配置類上添加 @ComponentScan 注解。
*該注解默認(rèn)會(huì)掃描該類所在的包下所有的配置類,相當(dāng)于之前的 <context:component-scan>。
*/
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication

1.1@SpringBootConfiguration: 源碼如下

Spring Boot定義的配置類;
標(biāo)注在某個(gè)類上,表示這是一個(gè)Spring Boot的配置類;
其中包含 @Configuration注解

@Target({ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Configuration
 public @interface SpringBootConfiguration
1.1.1 @Configuration: 源碼如下

@Configuration注解是Spring底層的注解
SpringBoot配置類上面需要標(biāo)注這個(gè)注解
而 配置類 ---->相當(dāng)于 ----> 配置文件
配置類也相當(dāng)于容器中的一個(gè)組件@Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration 
1.2@EnableAutoConfiguration:開啟自動(dòng)配置功能; 源碼如下

以前我們需要配置的東西,Spring Boot幫我們自動(dòng)配置;
@EnableAutoConfiguration告訴SpringBoot開啟自動(dòng)配置功能;這樣自動(dòng)配置才能生效;

 @Target({ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Inherited
 @AutoConfigurationPackage
 @Import({AutoConfigurationImportSelector.class})
 public @interface EnableAutoConfiguration

1.2.1 @AutoConfigurationPackage:自動(dòng)配置包

該注解使用@Import({Registrar.class})完成的功能

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
1.2.1.1@Import({Registrar.class}):Spring底層注解@Import,給容器中導(dǎo)入一個(gè)組件;

該注解屬于@AutoConfigurationPackage內(nèi)的注解

Registrar.class ==》 org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar
導(dǎo)入的組件由org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar將主配置類 (@SpringBootApplication標(biāo)注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器;

這里controller包是在主程序所在的包下,所以會(huì)被掃描到,我們?cè)趕pringboot包下創(chuàng)建一個(gè)test包,把controller放在test包下,這樣啟動(dòng)在啟動(dòng)也無(wú)法掃描到test包下的controller,從而訪問test包下的controller就是404

image.png
1.2.2 @Import({AutoConfigurationImportSelector.class})

該注解屬于@EnableAutoConfiguration內(nèi)的注解

AutoConfigurationImportSelector.class將所有需要導(dǎo)入的組件以全類名的方式返回;這些組件就會(huì)被添加到容器中;
會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類( xxxxAutoConfiguration );就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件;
有了自動(dòng)配置類,免去了我們手動(dòng)編寫配置注入功能組件等的工作;

image.png

接上圖的大圖

小結(jié)

J2EE的整體整合解決方案和自動(dòng)配置都在:spring-boot-autoconfigure-2.2.1.RELEASE.jar

Spring Boot在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類導(dǎo)入到容器中,自動(dòng)配置類就生效,幫我們進(jìn)行自動(dòng)配置工作;
以前我們需要自己配置的東西,自動(dòng)配置類都幫我們完成了;


小結(jié)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容