1. 程式人生 > >關於SpringBoot的一點筆記

關於SpringBoot的一點筆記

super leg 屬性。 ise 屬性 ring thead cti 進行

@SpringBootApplication

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

    public static void main(String[] args) {

        // Spring應用啟動起來
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

@SpringBootApplication

: Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用

@SpringBootConfiguration:Spring Boot的配置類;

  標註在某個類上,表示這是一個Spring Boot的配置類;

?   @Configuration:配置類上來標註這個註解;

?   配置類 ----- 配置文件;配置類也是容器中的一個組件;@Component

  @EnableAutoConfiguration:開啟自動配置功能;

?   以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration

告訴SpringBoot開啟自動配置功能;這樣自動配置才能生效;

技術分享圖片

@Value獲取值和@ConfigurationProperties獲取值比較

@ConfigurationProperties@Value
功能 批量註入配置文件中的屬性 一個個指定
松散綁定(松散語法) 支持 不支持
SpEL 不支持 支持
JSR303數據校驗 支持 不支持
復雜類型封裝 支持 不支持

SpringBoot推薦給容器中添加組件的方式;推薦使用全註解的方式

1、配置類@Configuration------>Spring配置文件(表明這是一個配置類)

2、使用@Bean

給容器中添加組件

/**
 * @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置文件
 *
 * 在配置文件中用<bean><bean/>標簽添加組件
 *
 */
@Configuration
public class MyAppConfig {

    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new HelloService();
    }
}

Springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件

–file:./config/ ---當前項目的根路徑下的config文件夾下的配置文件,和src同級的config文件夾下,

–file:./              ---當前項目的根路徑下的配置文件,和src同級的配置文件

–classpath:/config/ ---當前類路徑下的config文件夾下的congfig文件夾下的配置文件,在resource文件夾下的config文件夾中

–classpath:/ ---當前類路徑下的配置文件,也是默認的配置文件位置

優先級由高到底,高優先級的配置會覆蓋低優先級的配置;

SpringBoot會從這四個位置全部加載主配置文件;互補配置  

自動配置原理:

1)、SpringBoot啟動的時候加載主配置類,開啟了自動配置功能 ==@EnableAutoConfiguration==

2)、@EnableAutoConfiguration 作用:

  • 利用EnableAutoConfigurationImportSelector給容器中導入一些組件?

  • 可以查看selectImports()方法的內容;

  • List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置

  • SpringFactoriesLoader.loadFactoryNames()
    掃描所有jar包類路徑下  META-INF/spring.factories
    把掃描到的這些文件的內容包裝成properties對象
    從properties中獲取到EnableAutoConfiguration.class類(類名)對應的值,然後把他們添加在容器中

@ConditionalOnMissingBean這個註解比較有意思,這個註解就是判斷當前項目中是否有制定的配置文件,若沒有則使用默認的配置文件,如果有則使用開發人員配置的配置文件(類)

精髓:

? 1)、SpringBoot啟動會加載大量的自動配置類

? 2)、我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類;

? 3)、我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)

? 4)、給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值;

xxxxAutoConfigurartion:自動配置類;

給容器中添加組件

xxxxProperties:封裝配置文件中相關屬性;

擴展SpringMVC

編寫一個配置類(@Configuration),是WebMvcConfigurerAdapter類型;不能標註@EnableWebMvc;

既保留了所有的自動配置,也能用我們擴展的配置;

//使用WebMvcConfigurerAdapter可以來擴展SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       // super.addViewControllers(registry);
        //瀏覽器發送 /atguigu 請求來到 success
        registry.addViewController("/atguigu").setViewName("success");
    }
}

1)、WebMvcAutoConfiguration是SpringMVC的自動配置類

? 2)、在做其他自動配置時會導入;@Import(EnableWebMvcConfiguration.class)

  @Configuration
    public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
      private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

     //從容器中獲取所有的WebMvcConfigurer
      @Autowired(required = false)
      public void setConfigurers(List<WebMvcConfigurer> configurers) {
          if (!CollectionUtils.isEmpty(configurers)) {
              this.configurers.addWebMvcConfigurers(configurers);
                //一個參考實現;將所有的WebMvcConfigurer相關配置都來一起調用;  
                @Override
             // public void addViewControllers(ViewControllerRegistry registry) {
              //    for (WebMvcConfigurer delegate : this.delegates) {
               //       delegate.addViewControllers(registry);
               //   }
              }
          }
    }

3)、容器中所有的WebMvcConfigurer都會一起起作用;

? 4)、我們的配置類也會被調用;

? 效果:SpringMVC的自動配置和我們的擴展配置都會起作用;

@EnableWebMvc全面接管SpringMVC,會使自動配置失效

如何修改SpringBoot的默認配置

模式:

? 1)、SpringBoot在自動配置很多組件的時候,先看容器中有沒有用戶自己配置的(@Bean、@Component)如果有就用用戶配置的,如果沒有,才自動配置;如果有些組件可以有多個(ViewResolver)將用戶配置的和自己默認的組合起來;

? 2)、在SpringBoot中會有非常多的xxxConfigurer幫助我們進行擴展配置

? 3)、在SpringBoot中會有很多的xxxCustomizer幫助我們進行定制配置

關於SpringBoot的一點筆記