1. 程式人生 > >Spring boot 梳理 [email 

Spring boot 梳理 [email 

  1. @EnableWebMvc=繼承DelegatingWebMvcConfiguration=繼承WebMvcConfigurationSupport
    1. 直接看原始碼,@EnableWebMvc實際上引入一個DelegatingWebMvcConfiguration  
      1. @Retention(RetentionPolicy.RUNTIME)
        @Target({ElementType.TYPE})
        @Documented
        @Import({DelegatingWebMvcConfiguration.class})
        public
        @interface EnableWebMvc { }

         

      2. DelegatingWebMvcConfiguration繼承了WebMvcConfigurationSupport
        1. @Configuration
          public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
          ...
    2. @EnableWebMvc,WebMvcConfigurationSupport,WebMvcConfigurer和WebMvcConfigurationAdapter使用

      1. WebMvcConfigurationAdapter已經廢棄,最好用implements WebMvcConfigurer代替

        @Configuration
        public class MyConfig implements WebMvcConfigurer {
            
        }

        如果使用繼承,WebMvcConfigurationSupport,DelegatingWebMvcConfiguration,或者使用@EnableWebMvc,

        需要注意會覆蓋application.properties中關於WebMvcAutoConfiguration的設定,需要在自定義配置中實現,如

        springboot2.0、spring5.0 攔截器配置WebMvcConfigurerAdapter過時使用WebMvcConfigurationSupport來代替 新坑

        示例如下

        Configuration
        @EnableWebMvc
        public class MyConfig implements WebMvcConfigurer {
        
        }
        @Configuration
        public class MyConfig extends WebMvcConfigurationSupport {
        
        }
        @Configuration
        public class MyConfig extends DelegatingWebMvcConfiguration {
        
        }
        上面程式碼中需要在類中實現關於WebMvcAutoConfiguration的配置,而不是在application.properties中。
      2. 總結

        implements WebMvcConfigurer : 不會覆蓋@EnableAutoConfiguration關於WebMvcAutoConfiguration的配置
        @EnableWebMvc + implements WebMvcConfigurer : 會覆蓋@EnableAutoConfiguration關於WebMvcAutoConfiguration的配置
        extends WebMvcConfigurationSupport :會覆蓋@EnableAutoConfiguration關於WebMvcAutoConfiguration的配置
        extends DelegatingWebMvcConfiguration :會覆蓋@EnableAutoConfiguration關於WebMvcAutoConfiguration的配置
  2.   @EnableAutoConfiguration
    1. @EnableAutoConfiguration是springboot專案的啟動類註解@SpringBootApplication的子元素,主要功能為自動配置
    2. @EnableAutoConfiguration實際是匯入了EnableAutoConfigurationImportSelector和Registrar兩個類
    3. @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      @AutoConfigurationPackage
      @Import({AutoConfigurationImportSelector.class})
      public @interface EnableAutoConfiguration {
      ...
      }
      @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      @Import({Registrar.class})
      public @interface AutoConfigurationPackage {
      }

       

    4. 這兩個類的具體原理有些複雜,不太清除,主要內容是通過SpringFactoriesLoader.loadFactoryNames()匯入jar下面的配置檔案META-INF/spring.factories
    5. 配置檔案中的內容如下
      1. # Auto Configure
        org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
        org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
        ...
        org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
        org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
        org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\

         

    6.   其中有WebMvcAutoConfiguration,WebMvcAutoConfiguration原始碼如下
      1. @Configuration
        @ConditionalOnWebApplication(
            type = Type.SERVLET
        )
        @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
        @ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
        @AutoConfigureOrder(-2147483638)
        @AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
        public class WebMvcAutoConfiguration {
        ...猜測,Spring boot 在此處載入 application.properties 中關於MVC的預設配置;如果@Conditional返回false,則該配置類不執行
        }

         

      2. @ConditionalOnMissingBean({WebMvcConfigurationSupport.class})意思是如果存在它修飾的類的bean
        ,則不需要再建立這個bean。
      3. 由此可得出結論:
        如果有配置檔案繼承了DelegatingWebMvcConfiguration,
        或者WebMvcConfigurationSupport,或者配置檔案有@EnableWebMvc,那麼 @EnableAutoConfiguration 中的
        WebMvcAutoConfiguration 將不會被自動配置,而是使用WebMvcConfigurationSupport的配置。
  3. @SpringBootApplication
    1. @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      @SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan(
          excludeFilters = {@Filter(
          type = FilterType.CUSTOM,
          classes = {TypeExcludeFilter.class}
      ), @Filter(
          type = FilterType.CUSTOM,
          classes = {AutoConfigurationExcludeFilter.class}
      )}
      )
      public @interface SpringBootApplication {
      ...
      }

       

  4. 轉:https://www.cnblogs.com/sufferingStriver/p/9026764.html