标签:
正文
Spring Boot提供的自动配置都是位于包 org.springframework.boot.autoconfigure 之下。
1 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自动配置里面的最高优先级 2 @Configuration 3 @ConditionalOnWebApplication // 仅限于web应用 4 @Import(BeanPostProcessorsRegistrar.class) // 导入内置容器的设置 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 @Configuration 14 @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 @Configuration 21 @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个容器类是基于classpath中的class文件来判断使用哪个容器,默认使用内置容器。
1个bean注册类则是注册了一个 BeanPostProcessor bean,用于对容器进行定制。
public class EmbeddedServletContainerCustomizerBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware { // ... }
2、BeanPostProcessor接口,该接口内容如下:
1 public interface BeanPostProcessor { 2 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; 3 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; 4 }
根据方法的名字可以知道这是对在bean初始化之前、之后进行操作的方法。
BeanPostProcessor则是一个工厂钩子(factory hook),用于对新beans实例进行定制修改,例如检查它们的标记接口或者使用代理包装它们。
ApplicationContexts能够自动探测BeanPostProcessor beans,并将他们应用到后续创建的任意beans中。
简单bean工厂允许代码化的注册post-processors,并将注册的post-processors应用到该工厂创建的所有bean中。
典型的做法是,通过标记接口装配beans时,post-processors会实现postProcessBeforeInitialization;而使用代理包装beans时则会实现postProcessAfterInitialization。
1 public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware { 2 // ... 3 }
这是个静态内部类,实现了两个接口。
public interface ImportBeanDefinitionRegistrar { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry); }
该接口用于在系统处理@Configuration class时注册更多的bean。是bean定义级别的操作,而非@Bean method/instance级别的。
未完待续。
标签:
原文地址:http://www.cnblogs.com/larryzeal/p/5879395.html