正文
Spring Boot提供的自動(dòng)配置都是位于包 org.springframework.boot.autoconfigure 之下。
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 { ... }
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 }
3個(gè)容器類是基于classpath中的class文件來判斷使用哪個(gè)容器,默認(rèn)使用內(nèi)置容器。
1個(gè)bean注冊(cè)類則是注冊(cè)了一個(gè) BeanPostProcessor bean,用于對(duì)容器進(jìn)行定制。
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)行操作的方法。
BeanPostProcessor則是一個(gè)工廠鉤子(factory hook),用于對(duì)新beans實(shí)例進(jìn)行定制修改,例如檢查它們的標(biāo)記接口或者使用代理包裝它們。
ApplicationContexts能夠自動(dòng)探測BeanPostProcessor beans,并將他們應(yīng)用到后續(xù)創(chuàng)建的任意beans中。
簡單bean工廠允許代碼化的注冊(cè)post-processors,并將注冊(cè)的post-processors應(yīng)用到該工廠創(chuàng)建的所有bean中。
典型的做法是,通過標(biāo)記接口裝配beans時(shí),post-processors會(huì)實(shí)現(xiàn)postProcessBeforeInitialization;而使用代理包裝beans時(shí)則會(huì)實(shí)現(xiàn)postProcessAfterInitialization。
1 public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {2 // ...3 }
這是個(gè)靜態(tài)內(nèi)部類,實(shí)現(xiàn)了兩個(gè)接口。
public interface ImportBeanDefinitionRegistrar { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);}
該接口用于在系統(tǒng)處理@Configuration class時(shí)注冊(cè)更多的bean。是bean定義級(jí)別的操作,而非@Bean method/instance級(jí)別的。
未完待續(xù)。
聯(lián)系客服