1. 程式人生 > 其它 >Springboot學習筆記(基礎篇)

Springboot學習筆記(基礎篇)

基礎

Spring Boot基礎篇筆記,涵蓋核心技術剛開頭的部分,包括yaml檔案語法格式,以及配置檔案相關知識。
更全面的筆記請參考文章底部分享連線。

1、自動裝配原理

1.1 依賴管理

  • 父專案做依賴管理

    pom.xml 檔案中可以看到整個springboot專案的maven依賴的是一個springboot的依賴

    <parent>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>
    
    <!-- spring-boot-starter-parent 的父依賴為 -->
    <parent>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>
    

​ 在 spring-boot-dependencies 中幾乎依賴了所有開發中常用的依賴版本號,並且自動版本仲裁機制

​ 所謂版本仲裁機制就是說在父依賴中規定好了每一個依賴的 version ,如果在引入的時候直接新增 標籤去更改,可能造成版本衝突。

  • 開發匯入starter場景啟動器

    springboot中所有的starter都是以 spring-boot-starter-* 方式,所以如果要使用自定義starter不要以這樣的命名開頭

    只要引入starter,這個場景所有常規需要的依賴都會自動引入

    SpringBoot所有支援的場景在 Developing with Spring Boot

    ,讓然也可以自定義starter,官方推薦命名格式為 xxxx-spring-boot-starter

    所有場景啟動器最底層的依賴都是 (我這裡以當前最新穩定版為例)

    <dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.3.7.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    
  • 無須關注依賴之間的版本號,自動版本仲裁

    引入預設依賴都可以不寫版本號,但是如果引入非仲裁的jar,要寫版本號

  • 可以修改版本號

    如果想自定義版本號,可以先進入dependencies中檢視當前版本,然後當前專案中重寫配置版本號,重寫版本號以後再次引入父依賴中的依賴時會自動使用當前專案中配置好的版本號

    <!-- 在當前maven中使用自定義屬性,springboot會自動讀取當前檔案的配置,標籤名為dependencies中的版本命名方式 -->
    <proterties>
    	<mysql.version>5.1.43</mysql.version>
    </proterties>
    

1.2 自動配置

  • 自動配好Tomcat

    • 引入Tomcat依賴
    • 配置Tomcat
  • 自動配好SpringMVC

    • 引入SpringMVC全套元件
    • 自動配好SpringMVC常用元件(功能)
  • 自動配好Web常見功能,如:字元編碼問題

    • SpringBoot幫我們配置好的所有Web開發的常見場景
  • 預設的包結構

    • 主程式所在的包以及其下面的所有子包裡面的元件都會被預設掃描進來
    • 無需以前的包掃描配置
    • 如果想要改變掃描路徑需要在 @SpringBootApplication(scanBasePackages = "com.zzc") 中指定掃描路徑,或者使用 @ComponentScan 指定掃描路徑
    @SpringBootApplication
    相當於
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan("com.xxx.xxx") 與主程式基本掃描路徑相同
    
  • 各種配置擁有預設值

    • 預設配置最終都是對映到MultipartProperties
    • 配置檔案的值最終會繫結每個類上,這個類會在容器中建立物件
  • 按需載入所有自動配置項

    • 有非常多的starter
    • 引入了哪些場景,這個場景的自動配置才會開啟
    • SpringBoot所有的自動配置功能都在 spring-boot-autoconfigure 包裡面
  • ......

2、容器功能

2.1 元件新增

1、@Configuration

  • 基本使用
  • Full模式與Lite模式
    • 示例
    • 最佳實戰
      • 配置類元件之間無依賴關係用Lite模式加速容器啟動過程,減少判斷
      • 配置類元件之間有依賴關係,方法會被呼叫得到之前單例項元件,用Full模式

MyConfig.java 配置類程式碼


/**
 * 1.配置類裡面使用@Bean標註在方法上給容器註冊元件,預設也是單例的
 * 2.配置類本身也是元件
 * 3.proxyBeanMethods:代理bean的方法 分為以下兩種模式:
 * Full(proxyBeanMethods = true)
 * Lite(proxyBeanMethods = false)
 * 輕量級模式是為了解決元件依賴問題,元件依賴即在User物件中還有子物件時可能產生的問題
 */
@Configuration(proxyBeanMethods = true) // 告訴SpringBoot這是一個配置類 == 配置檔案
public class MyConfig {

    /**
     * 外部無論對配置類中的這個元件註冊方法呼叫多少次獲取的都是之前註冊容器中的單例項物件
     */
    @Bean // 給容器中新增元件,以方法名作為元件的id,返回型別就是元件型別,返回的值就是在容器中的例項
    public User user01() {
        return new User("zhangsan", 19);
    }

    @Bean(name = "user02") // 也可以不使用方法名,使用自定義名稱
    public User sssss() {
        return new User("lisi", 22);
    }
}

SpringBoot主啟動類程式碼

/*
* @SpringBootApplication開啟了Spring的元件掃描和springboot的自動配置功能
相當於將以下三個註解組合在了一起
(1)@Configuration:表名該類使用基於Java的配置,將此類作為配置類
(2)@ComponentScan:啟用註解掃描
(3)@EnableAutoConfiguration:開啟springboot的自動配置功能
* */
@SpringBootApplication //exlucde必須有,資料來源注入異常
//掃描mapper下的所有mapper類,也可以只使用@Mapper來表示mapper類
@MapperScan("com.zzc.mapper")
public class HelloworldApplication {
    public static void main(String[] args) {
        // 返回我們IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(HelloworldApplication.class, args);
        // 檢視容器裡面的元件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String beanName : beanDefinitionNames) {
            System.out.println(beanName);
        }
        // 從容器中獲取元件
        User user01 = run.getBean("user01", User.class);
        User user02 = run.getBean("user02", User.class);
        System.out.println((user01 == user02)); // true SpringBoot中元件預設以單例模式存在

        // 如果@Configuration(proxyBeanMethods = true)則獲取到的bean就是代理物件呼叫方法,SpringBoot總會檢查這個元件是否在容器中存在
        // 也就是說要保證元件單例項,如果沒有則呼叫方法去建立
        // 如果為false則不是單例項
        MyConfig bean = run.getBean(MyConfig.class);
        User user03 = bean.user01();
        User user04 = bean.user01();
        System.out.println(user03 == user04);
    }
}

2、@Bean、@Component、@Controller、@Service、@Repository

​ 這些在SpringMVC中的註解都可以使用,只要它們都在與主啟動檔案同級的目錄下(基礎掃描路徑)

3、@ComponentScan、@Import

​ @Import註解引數中接收一個數組,可以自動為容器匯入多個元件(呼叫無參建構函式建立物件),要使用反射.class方式作為引數型別,預設匯入的元件名稱為全類名,例如com.zzc.server.pojo.User

4、@Conditional

​ 條件裝配:滿足Conditional指定的條件,則進行元件注入,在IDEA中使用 雙擊Shift鍵,搜尋@Conditional後使用快捷鍵 Ctrl+h 開啟繼承樹,可以發現有很多基於@Conditional註解的派生註解。

​ 比如說使用@ConditionalOnBean(name = "xxx"),如果使用在方法上,則代表如果容器中有xxx名稱的元件,該註解所在的方法上才會自動注入方法名(預設)的元件,如果@ConditionalOnBean用在類上,則代表只有容器中有xxx的元件時,該類中所有的@Bean標註的方法才會注入元件,否則都不生效。

2.2 原生配置檔案引入

1、@ImportResource

​ 可以指定原生Spring中.xml的格式去注入物件,比如 @ImportResource("classpath:beans.xml") ,classpath類路徑相當於/resources/

2.3 屬性值繫結

1、@ConfigurationProperties

2、@EnableConfigurationProperties + @ConfigurationProperties

​ 格式為:@EnableConfigurationProperties(User.class)

​ 該註解:1.開啟User配置繫結功能 2.將User這個元件自動註冊到容器中

3、@Component + @ConfigurationProperties

​ 在java中

@Component
@ConfigurationProperties(prefix = "mycar")
public class xxx{
    private String brand;
    private String price;
}

​ 在配置檔案中

mycar.brand=BYD
mycar.price=100000

3、自動配置原理入門

3.1 引導載入自動配置類

​ 在@SpringBootApplication核心啟動註解中,有如下三個合成註解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}),
                      @Filter(type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class})})
public @interface SpringBootApplication {......}

1、@SpringBootConfiguration

  • @Configuration代表當前是一個配置類

2、@ComponentScan

  • 掃描哪些包,Spring註解

3、@EnableAutoConfiguration (核心)

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

​ 3.1、@AutoConfigurationPackage 自動配置包

@Import({Registrar.class}) // 給容器中匯入一個元件
public @interface AutoConfigurationPackage {......}

// 利用Registrar給容器中匯入一系列元件
// 將指定的一個包下的所有元件匯入進來?核心啟動類所在的包下,因為合成註解中相當於直接掛在了主啟動類中

​ 3.2、@Import(AutoConfigurationImportSelector.class)

// 1.利用 getAutoConfigurationEntry(annotationMetadata); 給容器中批量匯入一些元件
// 2.利用 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);獲取所有需要匯入的容器中的配置類(元件)
// 3.利用工廠載入 (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList()); 得到所有的元件
// 4.從META-INF/spring.factories位置來載入一個檔案
// 預設掃描我們當前系統裡面所有META-INF/spring.factories位置的檔案
spring-boot-autoconfigure-2.4.1.jar 包裡面也有META-INF/spring.factories

spring-boot-autoconfigure-2.4.1./META-INF/spring.factories

相當於SpringBoot在配置檔案中寫死了,一啟動就要給容器中載入的所有配置類
# Auto Configure
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.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
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,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

3.2 按需開啟自動配置項

// 雖然我們127個場景的所有自動配置啟動的時候預設全部載入,但是最終會按需配置<127(如果算上別的bean,可能大於127)
// 在每一個jar包中的裝配中可以看到大量的@Conditional...類似的註解,因為使用了按需裝配,所以在沒有引入相應的包之前,按需裝配匯入多餘的元件

3.3 定製化修改自動配置

​ 在這個SpringMVC的檔案上傳解析器自動配置類中

 @Bean(name = {"multipartResolver"})
 @ConditionalOnMissingBean({MultipartResolver.class}) // 容器中沒有這個型別元件
 public StandardServletMultipartResolver multipartResolver() { // 容器中沒有這個名字
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
    return multipartResolver;
 }
// 這樣返回自己的操作時非常巧妙的,當用於自定義了檢視解析器以後,名字不是標準的multipartResolver時,SpringBoot會從容器

​ SpringBoot預設會在底層配好所有的元件。但是如果使用者自己配置了,則以使用者的配置優先

@Bean
@ConditionalOnMissingBean // 使用者優先大量依賴於這個註解,如果沒有則配置,有則不配置(使用者優先)
public CharacterEncodingFilter characterEncodingFilter(){}

​ 總結:

  • SpringBoot先載入所有的自動配置類 xxxxAutoConfiguration
  • 每個自動配置類按照條件進行生效,預設都會繫結配置檔案指定的值
  • 生效的配置類就會給容器中裝配很多元件
  • 只要容器中有這些元件,相當於這些功能都有了
  • 定製化配置
    • 使用者自己@Bean替換底層的元件
    • 使用者去看這個元件是獲取的配置檔案是什麼值就去修改

xxxxAutoConfiguration--->元件--->xxxProperties裡面取值---->application.properties

3.4 最佳實踐

  • 引入場景依賴
  • 檢視自動配置了哪些
  • 是否需要修改
    • 自己分析,引入場景對應的自動配置一般都生效了
    • 配置檔案中 debug=true 開啟除錯模式後會在控制檯中打印出各種資訊,Negative(不生效)、Positive(生效)
  • 是否需要修改
    • 參照文件修改配置項
    • 自定義加入或者替換元件
      • @Bean、@Component......
    • 自定義器 xxxCustomizer
    • ......

4、開發小技巧

​ 開發技巧,請自行查詢文件

4.1 Lombok

4.2 dev-tools (熱重啟)

​ 匯入依賴以後直接 ctrl + F9 ,即重新構建專案就會熱重啟,不改變不重啟,如果真正意義上的熱更新(動態替換)需要使用JRebel,一個付費的熱更新專案。

4.3 Spring Initailizr(專案初始化)

​ 由於專案的建立需要從Spring官網來下載,速度可能比較慢。也可以還源使用阿里雲的初始化。

SpringBoot2核心技術

1、配置檔案

1.1、properties

​ 同以前的properties用法

1.2、yaml

​ 非常適合用來做以資料為中心的配置檔案

1.2.2、基本語法

  • key: value; kv之間有一個空格!
  • 大小寫敏感
  • 使用縮排表示層級關係
  • 縮排不允許使用tab,只允許空格
  • 縮排的空格數不重要,只要相同層級的元素左對齊即可
  • '#' 表示註釋
  • 表示字串可以使用雙引號或者不加引號,如果使用單引號則會對字串進行轉義

1.2.3、資料型別

  • 字面量:單個的、不可再分的值。date、boolean、string、number、null

    key: value
    
  • 物件:鍵值對的集合。map、hash、set、object

    # 行內寫法
    key: {k1:v1,k2:v2,k3:v3}
    # 常規寫法
    key:
      k1: v1
      k2: v2
      k3: v3
    
  • 陣列:一組按次序排列的值。array、list、queue

    # 行內寫法
    key: [v1,v2,v3]
    # 常規寫法
    k:
      - v1
      - v2
      - v3
    

1.2.4 程式碼例項

​ 建立Person.java

@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String[] interests;
    private List<String> animal;
    private Map<String, Object> scores;
    private Set<Double> salarys;
    private Map<String, List<Pet>> allPets;

}

​ application.yaml

person:
  userName: zhangsan
  boss: true
  birth: 2019/12/9
  age: 18
  interests:
    - 足球
    - 籃球
    - 乒乓球
  animal: [ 阿貓,阿狗 ]
  scores:
    english:
      first: 20
      second: 40
      third: 87
    math: [ 123,111,98 ]
  salarys:
    - 9999.98
    - 19231.22
  allPets:
    sick:
      - { name: tom,weight: 29.3 }
      - name: mydog
        weight: 12.37
    health: [ { name: mario,weight: 47 } ]
  pet:
    name: 這是一隻狗
    weight: 22.13

​ HelloController.java

@RestController
public class HelloController{
    @Autowired
    private Person person;
    
    @GetMapping("/")
    public Person person(){
        return person;
    }
}

​ 訪問 "/" 後提示json資訊

2、Web開發

......原版詳細的筆記請參考尚矽谷大神的筆記

01、Spring與SpringBoot · 語雀 (yuque.com)