SpringBoot 02: 初識SpringBoot

2022-11-10 18:01:54

1. SpringBoot

產生原因

  • spring, springmvc框架使用上的一些缺點:

  • 需要使用的大量的組態檔

  • 還需要設定各種物件

  • 需要把使用的物件放入到spring容器中才能使用物件

  • 需要了解其他框架設定規則


  • springboot的一些直觀優點:

  • SpringBoot就相當於簡化了組態檔的Spring+SpringMVC(但springboot的核心還是IOC容器)

  • 常用的框架和第三方庫都已經設定好了, 只需要引入使用即可

特點

  • Create stand-alone Spring applications
可以建立spring應用
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
內嵌的tomcat, jetty, Undertow 
  • Provide opinionated 'starter' dependencies to simplify your build configuration
提供了starter起步依賴, 簡化應用的設定:   
比如使用MyBatis框架, 需要在Spring專案中, 需要設定MyBatis的物件, SqlSessionFactory以及Dao的代理物件
但在SpringBoot專案中, 只要在pom.xml裡面加入一個mybatis-spring-boot-starter依賴
  • Automatically configure Spring and 3rd party libraries whenever possible
儘可能去自動設定spring和第三方庫, 叫做自動設定(就是把spring中的,第三方庫中的物件都建立好,放到容器中,開發人員可以直接使用)
  • Provide production-ready features such as metrics, health checks, and externalized configuration
提供了健康檢查, 統計, 外部化設定
  • Absolutely no code generation and no requirement for XML configuration
不用生成程式碼,不需要使用xml檔案做設定

2. SpringBoot專案

地址

@SpringBootApplication註解

  • 位於專案啟動類上面,是複合註解, 包含以下註解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
  • 而@SpringBootConfiguration又是包含@Configuration的符合註解
@Configuration
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

//說明使用了@SpringBootConfiguration註解標註的類,可以作為組態檔使用的,可以使用Bean宣告物件,注入到容器
  • @EnableAutoConfiguration
啟用自動設定,把java物件設定好,注入到spring容器中。例如可以把mybatis的物件建立好,放入到容器中
  • @ComponentScan
掃描器,找到註解,根據註解的功能建立物件,給屬性賦值等等。預設掃描的包:@ComponentScan所在的類,以及其所在類所在的包和子包。

SpringBoot的組態檔

  • 名稱:application
  • 字尾:property(key=value) 或 yml(key:value)
  • 組態檔範例:
  • 例1:application.properties設定埠和上下文
#設定埠號
server.port=9090

#設定存取應用上下文路徑,contextpath
server.servlet.context-path=/myboot
  • 例2:application.yml,組態檔的結構更加清晰,推薦使用
server:
  port: 9090
  servlet:
    context-path:/myboot

多環境組態檔

  • 實際場景中,專案的設定會有開發環境,測試環境,上線的環境

  • 每個環境有不同的設定資訊,例如埠,上下文,資料庫url,使用者名稱,密碼等等

  • 使用多環境組態檔,可以方便的切換不同的設定

  • 使用方式:建立多個組態檔,名稱規則:application-環境名稱.properties(或者字尾未yml格式)

  • 多環境組態檔的範例如下:

  • 建立開發環境的組態檔:application-dev.properties(或者application-dev.yml )

  • 建立測試者使用的設定:application-test.properties

  • springboot預設讀取application.properties檔案,故需在該檔案中設定實際需要讀取的核心組態檔

#以啟用組態檔 application-dev.properties為例
spring.profiles.active=dev

@ConfigurationProperties

  • 設計思想:把組態檔的資料對映到java物件的屬性上,將組態檔中某些開頭和prefix指定的值相同的對應組態檔中的值賦給對應屬性
  • 例如:application.properties
#自定義key=value
school.name=橘子
school.website=www.test.com
school.address=黑龍江哈爾濱
  • 則對應的實體類應該如下,其中name會被注入組態檔中的school.name的值,其他屬性類似
@Component
@ConfigurationProperties(prefix = "school")
public class SchoolInfo {

    private String name;

    private String website;

    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getWebsite() {
        return website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "SchoolInfo{" +
                "name='" + name + '\'' +
                ", website='" + website + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

使用jsp

  • SpringBoot不推薦使用jsp, 而是使用模板技術代替jsp
  • 如果要使用jsp, 需要新增如下依賴,負責編譯jsp檔案
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
  • 如果需要使用servlet, jsp, jstl的功能, 需要新增如下依賴
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
</dependency>

<dependency>
<groupId>javax.servlet.jsp</groupId>
	<artifactId>javax.servlet.jsp-api</artifactId>
	<version>2.3.1</version>
</dependency>
  • 建立一個存放jsp的目錄, 一般為src/main/webapp目錄,記得設定webapp的目錄屬性
  • 需要在pom.xml指定jsp檔案編譯後的存放目錄:META-INF/resources
<resource>
	<directory>src/main/webapp</directory>
	<targetPath>META-INF/resources</targetPath>
	<includes>
		<include>**/*.*</include>
	</includes>
</resource>
  • 建立Controller, 存取jsp
  • 在application.propertis檔案中設定檢視解析器
#設定檢視解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp

手動使用SpringBoot容器獲取物件

  • 關注SpringBoot工程的主啟動類的run方法
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 關注上述run方法的返回值
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
    return run(new Class[]{primarySource}, args);
}
  • 而ConfigurableApplicationContext是ApplicationContext的子介面
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {
}
  • 所以接收SpringBoot主啟動類的run方法的返回值就可以獲取到SpringBoot容器
  • 之後便可以按照需求呼叫SpringBoot容器的方法獲取已經註冊到容器中的物件

CommandLineRunner介面 與 ApplcationRunner介面

  • 兩個介面
@FunctionalInterface
public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

@FunctionalInterface
public interface ApplicationRunner {
    void run(ApplicationArguments args) throws Exception;
}
  • 兩個介面都有一個run方法
  • SpringBoot專案的主啟動類實現上述介面,重寫run方法,在容器物件建立好後自動執行run()方法
  • 可以在容器物件建立好後完成一些自定義的操作