zoukankan      html  css  js  c++  java
  • 28. SpringBoot 嵌入式Servlet 自动配置原理

    在 spring-boot-autoconfigure1.5.9.RELEASEspring-boot-autoconfigure-1.5.9.RELEASE.jar!orgspringframeworkootautoconfigurewebEmbeddedServletContainerAutoConfiguration.class

    这个类中,他是用来配置Servlet容器的,EmbeddedServletContainerAutoConfiguration【源码可自己下载 一般看class即可】

    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
    @Configuration
    @ConditionalOnWebApplication
    @Import(BeanPostProcessorsRegistrar.class)
    //导入BeanPostProcessorsRegistrar:给容器中导入一些组件【后置处理器的注册器】
    //导入了EmbeddedServletContainerCustomizerBeanPostProcessor:
    //后置处理器:bean初始化前后(创建完对象,还没赋值赋值)执行初始化工作
    public class EmbeddedServletContainerAutoConfiguration {
    @Configuration
        @ConditionalOnClass({ Servlet.class, Tomcat.class })    //判断当前是否引入了Tomcat依赖;
        @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)  //判断当前容器没有用户自己定义EmbeddedServletContainerFactory:嵌入式的 Servlet容器工厂;作用:创建嵌入式的Servlet容器
        public static class EmbeddedTomcat {

    1)、EmbeddedServletContainerFactory(嵌入式Servlet容器工厂)

    public interface EmbeddedServletContainerFactory {
    //获取嵌入式的Servlet容器
    EmbeddedServletContainer getEmbeddedServletContainer(
    ServletContextInitializer... initializers);
    }

    2)、EmbeddedServletContainer:(嵌入式的Servlet容器)

    3)、以TomcatEmbeddedServletContainerFactory为例

    @Override
    public EmbeddedServletContainer getEmbeddedServletContainer(
    ServletContextInitializer... initializers) {
    //创建一个Tomcat
    Tomcat tomcat = new Tomcat();
    //配置Tomcat的基本环节
    File baseDir = (this.baseDirectory != null ? this.baseDirectory: createTempDir("tomcat"));
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    Connector connector = new Connector(this.protocol);
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);
    tomcat.setConnector(connector);
    tomcat.getHost().setAutoDeploy(false);
    configureEngine(tomcat.getEngine());
    for (Connector additionalConnector : this.additionalTomcatConnectors) {
    tomcat.getService().addConnector(additionalConnector);
    }
    prepareContext(tomcat.getHost(), initializers);
    //将配置好的Tomcat传入进去,返回一个EmbeddedServletContainer;并且启动Tomcat服务器
    return getTomcatEmbeddedServletContainer(tomcat);
    }

    4)、我们对嵌入式容器的配置修改是怎么生效?

    ServerProperties、EmbeddedServletContainerCustomizer

    EmbeddedServletContainerCustomizer:定制器帮我们修改了Servlet容器的配置?

    怎么修改的原理?

    5)、容器中导入了EmbeddedServletContainerCustomizerBeanPostProcessor

    步骤:

    1)、SpringBoot根据导入的依赖情况,给容器中添加相应的 EmbeddedServletContainerFactory【TomcatEmbeddedServletContainerFactory】

    2)、容器中某个组件要创建对象就会惊动后置处理器; EmbeddedServletContainerCustomizerBeanPostProcessor; 只要是嵌入式的Servlet容器工厂,后置处理器就工作;

    3)、后置处理器,从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法

     

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15163967.html

  • 相关阅读:
    Zend_Controller架构
    PHP构造函数的执行顺序
    MySQL性能优化的最佳21条经验
    MySQL触发器学习总结
    使用Zend_Auth和Zend_Acl进行登录认证及根据用户角色进行权限控制
    手动释放你的资源(Please release resources manually)
    InfoPath/SharePoint/WebParts项目组章程 无为而为
    解决错误:sql_variant is incompatible with xml (ASP.NET 2.0 / XML数据类型 ) 无为而为
    使用ISA2004发布SharePoint网站到外部网,需要使用链接转换 无为而为
    InfoPath/SharePoint/WebParts项目组 下一步的工作和团队未来的规划给队员的公开信 无为而为
  • 原文地址:https://www.cnblogs.com/bi-hu/p/15163967.html
Copyright © 2011-2022 走看看