免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Spring Boot自動(dòng)配置類
前提
1、一般來說,xxxAware接口,都提供了一個(gè)setXxx的方法,以便于其實(shí)現(xiàn)類將Xxx注入自身的xxx字段中,從而進(jìn)行操作。
例如 ApplicationContextAware ,就提供了 void setApplicationContext(ApplicationContext applicationContext) throws BeansException,從而讓其實(shí)現(xiàn)可以直接操作 applicationContext 。
2、Spring中的 BeanFactory,這是訪問bean container 的root interface。其實(shí)現(xiàn)類的對(duì)象通常擁有一系列 bean 定義,并以不同的String 名字來區(qū)分。
但是,官方文檔不建議直接使用這種方式獲取bean,而是建議使用注入的方式獲取bean(@Autowire)。--這個(gè),前期不能使用初始化注入吧?

正文

Spring Boot提供的自動(dòng)配置都是位于包 org.springframework.boot.autoconfigure 之下。

注意,
       ① 這里是Spring Boot提供的,而非第三方(如MyBatis-Spring-Boot-Starter)提供的。
       ② 不包含Spring Boot Actuator部分的。 
Spring Boot的自動(dòng)配置類可以通過autoconfig report查看,需要開啟 --debug 或 -Debug。或者在 Actuator 項(xiàng)目的autoconfig 端點(diǎn)查看。
這里先從Web開始學(xué)習(xí)
由于Spring Boot的web Starter集成了Spring MVC,而非其他,所以實(shí)際上提供的Web自動(dòng)配置為Spring MVC的自動(dòng)配置。
Spring MVC的自動(dòng)配置在包 org.springframework.boot.autoconfigure.web 之下,該包中的內(nèi)容如下:

 


從上圖中可以清楚的看到Spring Boot為Spring MVC提供了哪些自動(dòng)配置:
  • DispatcherServletAutoConfiguration.class
  • EmbeddedServletContainerAutoConfiguration.class
  • ErrorMvcAutoConfiguration.class
  • GsonHttpMessageConvertersConfiguration.class
  • HttpEncodingAutoConfiguration.class
  • HttpMessageConvertersAutoConfiguration.class
  • JacksonHttpMessageConvertersConfiguration.class
  • MultipartAutoConfiguration.class
  • ServerPropertiesAutoConfiguration.class
  • WebClientAutoConfiguration.class
  • WebMvcAutoConfiguration.class
另外,還有一類文件:xxxProperties.class。這些文件都是 @ConfigurationProperties classes 。
在 @Configuration classes上可以使用 @EnableConfigurationProperties 進(jìn)行 @ConfigurationProperties classes 的注入。 -- 也可以在@Configuration classes內(nèi)部使用@Bean,略麻煩。
接下來,我們有針對(duì)性的來捋一遍。
先看一下這些類的聲明
 1 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) 2 @Configuration 3 @ConditionalOnWebApplication 4 @ConditionalOnClass(DispatcherServlet.class) 5 @AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class) 6 public class DispatcherServletAutoConfiguration { ... } 7  8 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) 9 @Configuration10 @ConditionalOnWebApplication11 @Import(BeanPostProcessorsRegistrar.class)12 public class EmbeddedServletContainerAutoConfiguration { ... }13 14 @Configuration15 @ConditionalOnClass(Gson.class)16 class GsonHttpMessageConvertersConfiguration { ... }17 18 @Configuration19 @EnableConfigurationProperties(HttpEncodingProperties.class)20 @ConditionalOnWebApplication21 @ConditionalOnClass(CharacterEncodingFilter.class)22 @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)23 public class HttpEncodingAutoConfiguration { ... }24 25 @Configuration26 @ConditionalOnClass(HttpMessageConverter.class)27 @AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class })28 @Import({ JacksonHttpMessageConvertersConfiguration.class, GsonHttpMessageConvertersConfiguration.class })29 public class HttpMessageConvertersAutoConfiguration { ... }30 31 @Configuration32 class JacksonHttpMessageConvertersConfiguration{ ... }33 34 @Configuration35 @ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })36 @ConditionalOnProperty(prefix = "spring.http.multipart", name = "enabled", matchIfMissing = true)37 @EnableConfigurationProperties(MultipartProperties.class)38 public class MultipartAutoConfiguration { ... }39 40 @Configuration41 @EnableConfigurationProperties42 @ConditionalOnWebApplication43 public class ServerPropertiesAutoConfiguration { ... }44 45 @Configuration46 @AutoConfigureAfter(HttpMessageConvertersAutoConfiguration.class)47 public class WebClientAutoConfiguration { ... }48 49 @Configuration50 @ConditionalOnWebApplication51 @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })52 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)53 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)54 @AutoConfigureAfter(DispatcherServletAutoConfiguration.class)55 public class WebMvcAutoConfiguration { ... }
整理一下優(yōu)先級(jí)
最高級(jí)
        EmbeddedServletContainerAutoConfiguration 
        DispatcherServletAutoConfiguration 
次高級(jí)
        WebMvcAutoConfiguration
無級(jí)別
        HttpEncodingAutoConfiguration
        MultipartAutoConfiguration 
        ServerPropertiesAutoConfiguration
  依賴鏈(屬于無級(jí)別)
        GsonHttpMessageConvertersConfiguration 
        JacksonHttpMessageConvertersConfiguration
        HttpMessageConvertersAutoConfiguration
        WebClientAutoConfiguration
一、先看一下 EmbeddedServletContainerAutoConfiguration,這是內(nèi)置Servlet容器的自動(dòng)配置 -- 默認(rèn)就是那個(gè) pivotal-tc-server (定制版tomcat,商業(yè)的)。
該類的聲明如下:
 1 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自動(dòng)配置里面的最高優(yōu)先級(jí) 2 @Configuration 3 @ConditionalOnWebApplication // 僅限于web應(yīng)用 4 @Import(BeanPostProcessorsRegistrar.class) // 導(dǎo)入內(nèi)置容器的設(shè)置 5 public class EmbeddedServletContainerAutoConfiguration { 6     @Configuration 7     @ConditionalOnClass({ Servlet.class, Tomcat.class }) 8     @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) 9     public static class EmbeddedTomcat {10         // ...11     }12 13     @Configuration14     @ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })15     @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)16     public static class EmbeddedJetty {17         // ...18     }19 20     @Configuration21     @ConditionalOnClass({ Servlet.class, Undertow.class, SslClientAuthMode.class })22     @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)23     public static class EmbeddedUndertow {24         // ...25     }26 27     public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {28         // ...29     }30 }
@ConditionalOnWebApplication 是基于application context 是否 web application context 進(jìn)行判斷。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) ,這里的 Ordered.HIGHEST_PRECEDENCE  其實(shí)是int類型的最小值,代表最高的優(yōu)先級(jí)。
@Import(BeanPostProcessorsRegistrar.class,這里 BeanPostProcessorsRegistrar 中進(jìn)行的操作是注冊(cè)了一個(gè)bean,  EmbeddedServletContainerCustomizerBeanPostProcessor 。是通過 ImportBeanDefinitionRegistrar  進(jìn)行早期注冊(cè)。
這個(gè)配置類,內(nèi)部共有4個(gè)靜態(tài)內(nèi)部類:3個(gè)容器類(tomcat、jetty、undertow)、1個(gè)bean注冊(cè)類。
  1. 3個(gè)容器類是基于classpath中的class文件來判斷使用哪個(gè)容器,默認(rèn)使用內(nèi)置容器。
  2. 1個(gè)bean注冊(cè)類則是注冊(cè)了一個(gè) BeanPostProcessor bean,用于對(duì)容器進(jìn)行定制。
下面重點(diǎn)看一下這個(gè)bean注冊(cè)類的相關(guān)。
1、EmbeddedServletContainerCustomizerBeanPostProcessor
public class EmbeddedServletContainerCustomizerBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {    // ...}

2、BeanPostProcessor接口,該接口內(nèi)容如下:

1 public interface BeanPostProcessor {2     Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;3     Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;4 }

根據(jù)方法的名字可以知道這是對(duì)在bean初始化之前、之后進(jìn)行操作的方法。

該接口的Javadoc如下:
  1. BeanPostProcessor則是一個(gè)工廠鉤子(factory hook),用于對(duì)新beans實(shí)例進(jìn)行定制修改,例如檢查它們的標(biāo)記接口或者使用代理包裝它們。
  2. ApplicationContexts能夠自動(dòng)探測BeanPostProcessor beans,并將他們應(yīng)用到后續(xù)創(chuàng)建的任意beans中。
  3. 簡單bean工廠允許代碼化的注冊(cè)post-processors,并將注冊(cè)的post-processors應(yīng)用到該工廠創(chuàng)建的所有bean中。
  4. 典型的做法是,通過標(biāo)記接口裝配beans時(shí),post-processors會(huì)實(shí)現(xiàn)postProcessBeforeInitialization;而使用代理包裝beans時(shí)則會(huì)實(shí)現(xiàn)postProcessAfterInitialization
EmbeddedServletContainerCustomizerBeanPostProcessor 中提供了 postProcessBeforeInitialization 的實(shí)現(xiàn)(對(duì)bean有更多的操作,而非直接返回bean),對(duì)內(nèi)置容器進(jìn)行了定制操作。(插一句,這里的定制操作是通過applicationContext 中 EmbeddedServletContainerCustomizer beans進(jìn)行的,所以需要先獲取applicationContext(ApplicationContextAware的功勞),再從applicationContext中獲取EmbeddedServletContainerCustomizer beans)
3、回過頭來再看一下BeanPostProcessorsRegistrar
1 public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {2     // ...3 }

這是個(gè)靜態(tài)內(nèi)部類,實(shí)現(xiàn)了兩個(gè)接口。

4、接口ImportBeanDefinitionRegistrar
public interface ImportBeanDefinitionRegistrar {    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);}

該接口用于在系統(tǒng)處理@Configuration class時(shí)注冊(cè)更多的bean。是bean定義級(jí)別的操作,而非@Bean method/instance級(jí)別的。

這個(gè)方法,應(yīng)該是在Spring加載bean時(shí)被Spring調(diào)用。
org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader

 

未完待續(xù)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java布局管理器
Spring聲明式事務(wù)策略-Spring-Java -JavaEye做最棒的軟件開發(fā)交流社區(qū)
深入Spring:自定義注解加載和使用
看一下你家路由器有usb口嗎,這個(gè)接口可以自動(dòng)備份手機(jī)的相冊(cè)。
17.1 完整的容器分類法
Map是不是集合?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服