Java面試---Spring Boot

目錄

 

一、談談你對 SpringBoot 的理解

二、Spring 和 SpringBoot 有什麼不同

三、SpringBoot 與 Spring Cloud 的區別

四、SpringBoot 中的 application.properties 或者 application.yml 配置文件是什麼

五、SpringBoot 的核心配置文件有哪幾個?它們的區別是什麼?

六、SpringBoot 的配置文件有哪幾種格式?它們有什麼區別?

app:  user:    name: javastack七、SpringBoot 的核心註解是哪個?它主要由哪幾個註解組成的?

八、SpringBoot 自動配置及原理

九、如何理解 SpringBoot 中的 Starters

十一、Spring Boot 支持哪些日誌框架?推薦和默認的日誌框架是哪個?

十二、SpringBoot 實現熱部署有哪幾種方式

十三、如何理解 Spring Boot 配置加載順序

十四、Spring Boot 如何定義多套不同環境配置


一、談談你對 SpringBoot 的理解

簡單說說我的理解:Java是一個靜態語言,相比動態語言,它相對笨重,體現在我們搭建 SSM 框架寫一個 Helloword 的時候相當複雜,需要寫一大堆的配置。還有在導入 jar包依賴的時候版本號問題,令人頭疼。但是,我們有 Spring呀,真的是 Java 開發人員的福音。SpringBoot 就是爲解決這些問題而生的。讓我們寫一個 Helloword 跟動態語言一樣簡單。版本控制也通過 SpringBoot 與 Maven的插件進行整合管理,讓我們將重點放在業務的開發之上。下面就說說其優點:
【1】創建獨立的 Spring 應用,可以通過 java -jar xx.jar 直接運行;
【2】直接嵌入 Tomcat、Jetty或Undertow 等 Web 容器(不需要部署 war 文件),後期與雲計算平臺集成方便(docket);
【3】提供固化的 “starter”  的 pom 配置簡化構建 maven 配置,避免大量的 Maven導入和各種版本衝突;
【4】當條件滿足時自動裝配 Spring 或第三方類庫;
【5】提供運維特性,基於 ssh、http、telnet 對服務器進行監控、健康檢查以及外部化配置;
【6】SpringBoot 不需要 XML 配置,也不是通過代碼生成來實現,而是通過條件註解+類實現配置文件;
【7】基於環境的配置使用這些屬性,您可以將您正在使用的環境傳遞到應用程序:-Dspring.profiles.active = {enviornment}。在加載主應用程序屬性文件後,Spring 將在(application{environment}.properties)中加載後續的應用程序屬性文件。

二、Spring 和 SpringBoot 有什麼不同

【1】Maven 依賴:Spring Boot 對依賴進行了進一步封裝(starter),我們只需要根據場景依賴 starter 即可。在進行構建期間,所有其他依賴項將自動添加到項目中。

<!--首先,讓我們看一下使用Spring創建Web應用程序所需的最小依賴項-->

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

<!--與Spring不同,Spring Boot只需要一個依賴項來啓動和運行Web應用程序-->

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

【2】Spring Boot 擁有默認的配置信息,Spring Boot 只需要在 application 配置文件中配置幾個屬性來完成如下操作:所有Spring 配置都是通過一個名爲 auto-configuration 的過程添加 Boot web starter 來自動包含的。這意味着Spring Boot 將查看應用程序中存在的依賴項,屬性和 Bean,並根據這些依賴項,對屬性和 bean進行配置。當然,如果我們想要添加自己的自定義配置,那麼 Spring Boot 自動配置將會退回。

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

【3】  默認情況下,Spring Boot 使用嵌入式容器來運行應用程序。在這種情況下,Spring Boot 使用 public static void main 入口點來啓動嵌入式 Web服務器。此外,它還負責將 Servlet,Filter 和 ServletContextInitializer bean 從應用程序上下文綁定到嵌入式 servlet容器。Spring Boot 的另一個特性是它會自動掃描同一個包中的所有類或 Main 類的子包中的組件。Spring Boot 提供了將其部署到外部容器的方式:

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

【4】打包和部署:這兩個框架都支持 Maven 和 Gradle 等通用包管理技術。但是在部署方面,這些框架差異很大。例如,Spring Boot Maven 插件在 Maven中提供 Spring Boot支持。它還允許打​​包可執行jar 或 war包。在部署環境中 Spring Boot 對比 Spring的一些優點包括:
   ■ 提供嵌入式容器支持;
   ■ 使用命令 java -jar獨立運行 jar;
   ■ 在外部容器中部署時,可以選擇排除依賴關係以避免潛在的 jar 衝突;
   ■ 部署時靈活指定配置文件的選項;
   ■ 用於集成測試的隨機端口生成;

簡而言之,我們可以說 Spring Boot 只是 Spring本身的擴展,使開發,測試和部署更加方便。

三、SpringBoot 與 Spring Cloud 的區別

【1】Spring Cloud 基於Spring Boot,爲微服務體系開發中的架構問題,提供了一整套的解決方案——服務註冊與發現,服務消費,服務保護與熔斷,網關,分佈式調用追蹤,分佈式配置管理等。
【2】Spring Cloud 是一個基於 SpringBoot 實現的雲應用開發工具;SpringBoot 專注於快速、方便集成的單個個體,Spring Cloud 是關注全局的服務治理框架;SpringBoot使用了默認大於配置的理念,很多集成方案已經幫你選擇好了,能不配置就不配置,Spring Cloud 很大的一部分是基於 SpringBoot 來實現。

四、SpringBoot 中的 application.properties 或者 application.yml 配置文件是什麼

application.yml 和 application.properties(默認配置文件) 文件這兩種文件都是 SpringBoot的配置文件,註釋都可以用#號來註釋,只不過因爲application.yml 看起來更直觀,更清晰。但是要注意一點:properties 文件的優先級高於 yml文件,即如果兩個文件中都配置了端口號,只有 properties中的端口號有效,而 yml文件中端口配置無效。
【1】application.properties 文件,在 properties文件中是以 ”.”進行分割的;

application.properties
server.port=8085
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.url=jdbc:mysql://aliyuncs.com:3306/home?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=***
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

【2】application.yml文件,都是 K-V格式,並且通過 ” :  ” 引號進行賦值;需要注意冒號後面有個空格;

server:
  port: 8081
 
spring:
    datasource:
        name: test
        url: jdbc:mysql://localhost:3306/springbootdatabase
        username: root
        password: 123456
        # 使用druid數據源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20    

五、SpringBoot 的核心配置文件有哪幾個?它們的區別是什麼?

Spring Boot 中有以下兩種配置文件:bootstrap (.yml 或者 .properties) 和 application (.yml 或者 .properties):bootstrap 是應用程序的父上下文,也就是說 bootstrap 加載優先於 applicaton。這兩個上下文共用一個環境。它默認也不能被本地相同配置覆蓋。主要給運維人員使用,可以對開發的一些配置進行覆蓋。bootstrap 配置文件有以下幾個應用場景:使用 Spring Cloud Config 配置中心時,這時需要在 bootstrap 配置文件中添加連接到配置中心的配置屬性來加載外部配置中心的配置信息。一些固定的不能被覆蓋的屬性和一些加密/解密的場景。

六、SpringBoot 的配置文件有哪幾種格式?它們有什麼區別?

properties 和 .yml,它們的區別主要是書寫格式不同。 

【1】.properties:通過.進行分割。

app.user.name = javastack
【2】.yml:賦值的時候,冒號後面有個空格。不支持 @PropertySource 註解導入配置。可以通過如下註解:@ConfigurationProperties(prefix="xxx") String 類型的一定需要 setter 來接收屬性值;maps、collections和 arrays不需要。

app:
  user:
    name: javastack
七、SpringBoot 的核心註解是哪個?它主要由哪幾個註解組成的?

啓動類上面的註解是 @SpringBootApplication,它也是 Spring Boot 的核心註解,主要組合包含了以下 3 個註解:
【1】@SpringBootConfiguration:組合了 @Configuration 註解,實現配置文件的功能。
【2】@EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項,如關閉數據源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
【3】@ComponentScan:Spring組件掃描。
【源碼博客連接】:鏈接

八、SpringBoot 自動配置及原理

【1】SpringBoot 啓動的時候加載主配置類,@SpringBootApplication下開啓了主配置功能 @EnableAutoConfiguration;
【2】@EnableAutoConfiguration 作用:

        ①、利用 EnableAutoConfigurationImportSelector 給容器導入一些組件。
        ②、可以查看 selectImports() 方法的內容:List configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置。SpringFactoriesLoader.loadFactoryNames() 掃描所有 jar包類路徑下 META‐INF/spring.factories 把掃描到的這些文件的內容包裝成 properties對象從 properties中獲取到 EnableAutoConfiguration.class 類(類名)對應的值,然後把他們添加在容器中。
【3】將類路徑下 META-INF/spring.factories 裏面配置的所有 EnableAutoConfiguration 的值加入到了容器中;

# EnableAutoConfiguration  對應 @EnableAutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\


 每一個這樣的 xxxAutoConfiguration 類都是容器中的一個組件,都加入到容器中。用他們來做自動配置;
【4】每一個自動配置類進行自動配置,以 HttpEncodingAutoConfiguration(Http編碼自動配置)爲例解釋自動配置原理;

@Configuration //表示這是一個配置類,以前編寫的配置文件一樣,也可以給容器中添加組件
@EnableConfigurationProperties(HttpEncodingProperties.class) //啓動指定類的
//ConfigurationProperties功能;將配置文件中對應的值和HttpEncodingProperties綁定起來;並把
//HttpEncodingProperties加入到ioc容器中
@ConditionalOnWebApplication //Spring底層@Conditional註解(Spring註解版),根據不同的條件,如果
//滿足指定的條件,整個配置類裏面的配置就會生效; 判斷當前應用是否是web應用,如果是,當前配置類生效
@ConditionalOnClass(CharacterEncodingFilter.class) //判斷當前項目有沒有這個類
//CharacterEncodingFilter;SpringMVC 中進行亂碼解決的過濾器;
//判斷配置文件中是否存在某個配置 spring.http.encoding.enabled;如果不存在,判斷也是成立的
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) 
//即使我們配置文件中不配置pring.http.encoding.enabled=true,也是默認生效的;
public class HttpEncodingAutoConfiguration {
    //他已經和SpringBoot的配置文件映射了
    private final HttpEncodingProperties properties;
    //只有一個有參構造器的情況下,參數的值就會從容器中拿
    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }
 
    @Bean //給容器中添加一個組件,這個組件的某些值需要從properties中獲取
    @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判斷容器沒有這個組件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }


根據當前不同的條件判斷,決定這個配置類是否生效?一但這個配置類生效;這個配置類就會給容器中添加各種組件;這些組件的屬性是從對應的 properties類中獲取的,這些類裏面的每一個屬性又是和配置文件綁定的;
【5】所有在配置文件中能配置的屬性都是在 xxxxProperties 類中封裝;配置文件能配置什麼就可以參照某個功能對應的屬性類

@ConfigurationProperties(prefix = "spring.http.encoding") //從配置文件中獲取指定的值和bean的屬性進行綁定
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");

精髓:【1】SpringBoot 啓動會加載大量的自動配置類;
【2】看我們需要的功能有沒有SpringBoot 默認寫好的自動配置類;
【3】我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)
【4】給容器中自動配置類添加組件的時候,會從 properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值;
   xxxxAutoConfigurartion:自動配置類,給容器中添加組件。xxxxProperties:封裝配置文件中相關屬性;
【更多配置信息連接】:鏈接

九、如何理解 SpringBoot 中的 Starters

Starters 可以理解爲啓動器,它包含了一系列可以集成到應用裏面的依賴包,你可以一站式集成 Spring及其他技術,而不需要到處找示例代碼和依賴包。如你想使用 Spring JPA訪問數據庫,只要加入 spring-boot-starter-data-jpa 啓動器依賴就能使用了。Starters 包含了許多項目中需要用到的依賴,它們能快速持續的運行,都是一系列得到支持的管理傳遞性依賴。

【1】starters 命名:Spring Boot 官方的啓動器都是以 spring-boot-starter-* 命名的,代表了一個特定的應用類型。第三方的啓動器不能以 spring-boot開頭命名,它們都被 Spring Boot官方保留。一般第三方應該這樣命名,像 mybatis 的 mybatis-spring-boot-starter。
【2】starters 分類:① Spring Boot 應用類啓動器;② Spring Boot 生產啓動器;③ Spring Boot 技術類啓動器;④ 其他第三方啓動器;

十、SpringBoot 有哪幾種讀取配置的方式
在 application.yml 或者 application.properties 文件中添加:

info.address=CN
info.company=SpringBoot
info.degree=high 
【1】@Value 註解讀取方式:

@Component
public class InfoConfig1 {
 
    @Value("${info.address}")
    private String address;
}

【2】@ConfigurationProperties 註解讀取方式:

@Component
@ConfigurationProperties(prefix = "info")
public class InfoConfig2 {
 
    private String address;
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
}

【3】 @PropertySource+@Value註解:讀取指定文件

@Component
@PropertySource(value = { "config/db-config.properties" })
public class DBConfig1 {
 
    @Value("${db.username}")
    private String username;
}

注意:@PropertySource不支持 yml文件讀取。 

【4】 @PropertySource+@ConfigurationProperties註解讀取方式:

@Component
@ConfigurationProperties(prefix = "db")
@PropertySource(value = { "config/db-config.properties" })
public class DBConfig2 {
 
    private String username;
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
}


【5】 Environment 讀取方式:

@Component
public class ReadByEnv {
 
    @Autowired
    private Environment environment;
 
    public String getServerPort() {
        return environment.getProperty("server.port");
    }
 
}

十一、Spring Boot 支持哪些日誌框架?推薦和默認的日誌框架是哪個?

Spring Boot 支持 Java Util Logging、Log4j2、Lockback 作爲日誌框架,如果你使用 starters啓動器,Spring Boot 將使用Logback 作爲默認日誌框架。無論使用哪種日誌框架,Spring Boot 都支持配置將日誌輸出到控制檯或者文件中。spring-boot-starter 啓動器包含 spring-boot-starter-logging 啓動器並集成了slf4j 日誌抽象及 Logback日誌框架。

【日誌源碼博客連接】:鏈接

十二、SpringBoot 實現熱部署有哪幾種方式

在 Spring Boot 實現代碼熱部署是一件很簡單的事情,代碼的修改可以自動部署並重新熱啓動項目。
【1】引用 devtools 依賴:當修改 java類時就會熱更新。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

【2】然後依次點擊 File-Settings-Build、Execution、Deployment-Complier,在右邊界面找到圖: 並打勾;下一步按住這幾個鍵 Ctrl+Shift+Alt+/,選中 Registry ,在彈出的提示框中找到 compiler.automake.allow.when.app.running 如下圖並打鉤,就可以順利使用了。


【3】devtools 會在 windows資源管理器佔用 java進程,在開發工具裏面殺不掉,只能手動 kill掉,不然重啓會選成端口重複綁定報錯。

注意事項:1、生產環境 devtools將被禁用,如 java -jar方式或者自定義的類加載器等都會識別爲生產環境。
2、打包應用默認不會包含 devtools,除非你禁用 SpringBoot Maven 插件的 excludeDevtools 屬性。
3、Thymeleaf 無需配置 spring.thymeleaf.cache:false,devtools 默認會自動設置,參考完整屬性。

十三、如何理解 Spring Boot 配置加載順序

Spring Boot 會涉及到各種各樣的配置,如開發、測試、生產就至少 3 套配置信息了。Spring Boot 可以輕鬆的幫助我們使用相同的代碼就能使開發、測試、生產環境使用不同的配置。在 Spring Boot 裏面,可以使用以下幾種方式來加載配置:
【1】properties文件;
【2】YML文件;
【3】系統環境變量;
【4】命令行參數等等;

【配置屬性加載的順序如下】:數字小的優先級越高,即數字小的會覆蓋數字大的參數值,我們來實踐下,驗證以上配置參數的加載順序。

 1、開發者工具 `Devtools` 全局配置參數; 
 2、單元測試上的 `@TestPropertySource` 註解指定的參數; 
 3、單元測試上的 `@SpringBootTest` 註解指定的參數; 
 4、命令行指定的參數,如 `java -jar springboot.jar --name="Java技術棧"`; 
 5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定參數, 如 `java Dspring.application.json='{"name":"Java技術棧"}' -jar springboot.jar` 
 6、`ServletConfig` 初始化參數; 
 7、`ServletContext` 初始化參數; 
 8、JNDI參數(如 `java:comp/env/spring.application.json`); 
 9、Java系統參數(來源:`System.getProperties()`); 
10、操作系統環境變量參數; 
11、`RandomValuePropertySource` 隨機數,僅匹配:`ramdom.*`; 
12、JAR包外面的配置文件參數(`application-{profile}.properties(YAML)`) 
13、JAR包裏面的配置文件參數(`application-{profile}.properties(YAML)`) 
14、JAR包外面的配置文件參數(`application.properties(YAML)`) 
15、JAR包裏面的配置文件參數(`application.properties(YAML)`) 
16、`@Configuration`配置文件上 `@PropertySource` 註解加載的參數; 
17、默認參數(通過 `SpringApplication.setDefaultProperties` 指定);


十四、Spring Boot 如何定義多套不同環境配置

首先我們要了解一個名詞:Profile。簡單來說,Profile 就是 Spring Boot 可以對不同環境或者指令來讀取不同的配置文件。假如有開發、測試、生產三個不同的環境,需要定義三個不同環境下的配置。

【1】基於 properties文件類型:你可以另外建立3個環境下的配置文件:然後在 applcation.properties 文件中指定當前的環境 spring.profiles.active=test,這時候讀取的就是 application-test.properties文件。

applcation.properties
application-dev.properties
application-test.properties
application-prod.properties

【2】基於 yml文件類型:只需要一個 applcation.yml 文件就能搞定,推薦此方式。此時讀取的就是 dev的配置。

spring:
  profiles:
    active: dev
 
---
#開發環境配置
spring:
  profiles: dev
 
server:
  port: 1000
 
 
---
#測試環境配置
spring:
  profiles: stg
 
server:
  port: 1001
 
 
---
#生產環境配置
spring:
  profiles: prd
 
server:
  port: 1002


【3】在 cmd 命令中指定:

java -jar xxx.jar --spring.profiles.actvie=dev 
 【4】在IDEA 編輯器中指定:在運行按鈕(綠色三角形按鈕)旁邊選擇  Edit Configurations...,在彈出的對話框中 Active profiles 輸入 dev 或其他即可。這種方法只有在本地調試的時候才生效。
【優秀博客連接】:鏈接

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章