最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring.mvc.servlet.load-on-startup屬性方法源碼解讀

 更新時間:2023年12月10日 08:36:13   作者:codecraft  
這篇文章主要介紹了spring.mvc.servlet.load-on-startup的屬性方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文主要研究一下spring.mvc.servlet.load-on-startup

spring.mvc.servlet.load-on-startup

org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java

@ConfigurationProperties(prefix = "spring.mvc")
public class WebMvcProperties {
    //......
    private final Servlet servlet = new Servlet();
    public static class Servlet {
        /**
         * Path of the dispatcher servlet.
         */
        private String path = "/";
        /**
         * Load on startup priority of the dispatcher servlet.
         */
        private int loadOnStartup = -1;
        public String getPath() {
            return this.path;
        }
        public void setPath(String path) {
            Assert.notNull(path, "Path must not be null");
            Assert.isTrue(!path.contains("*"), "Path must not contain wildcards");
            this.path = path;
        }
        public int getLoadOnStartup() {
            return this.loadOnStartup;
        }
        public void setLoadOnStartup(int loadOnStartup) {
            this.loadOnStartup = loadOnStartup;
        }
        public String getServletMapping() {
            if (this.path.equals("") || this.path.equals("/")) {
                return "/";
            }
            if (this.path.endsWith("/")) {
                return this.path + "*";
            }
            return this.path + "/*";
        }
        public String getPath(String path) {
            String prefix = getServletPrefix();
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            return prefix + path;
        }
        public String getServletPrefix() {
            String result = this.path;
            int index = result.indexOf('*');
            if (index != -1) {
                result = result.substring(0, index);
            }
            if (result.endsWith("/")) {
                result = result.substring(0, result.length() - 1);
            }
            return result;
        }
    }    
}
WebMvcProperties.Servlet定義了loadOnStartup屬性,默認為-1

DispatcherServletAutoConfiguration

org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration.java

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(DispatcherServlet.class)
@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)
public class DispatcherServletAutoConfiguration {

    //......

    @Configuration(proxyBeanMethods = false)
    @Conditional(DispatcherServletRegistrationCondition.class)
    @ConditionalOnClass(ServletRegistration.class)
    @EnableConfigurationProperties(WebMvcProperties.class)
    @Import(DispatcherServletConfiguration.class)
    protected static class DispatcherServletRegistrationConfiguration {

        @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
        @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
        public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,
                WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {
            DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,
                    webMvcProperties.getServlet().getPath());
            registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
            registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());
            multipartConfig.ifAvailable(registration::setMultipartConfig);
            return registration;
        }

    }

    //......
}
DispatcherServletRegistrationConfiguration注冊了DispatcherServletRegistrationBean,它會讀取webMvcProperties.getServlet().getLoadOnStartup()然后設(shè)置其loadOnStartup屬性

ServletRegistrationBean

org/springframework/boot/web/servlet/ServletRegistrationBean.java

public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
    private static final String[] DEFAULT_MAPPINGS = { "/*" };
    private T servlet;
    private Set<String> urlMappings = new LinkedHashSet<>();
    private boolean alwaysMapUrl = true;
    private int loadOnStartup = -1;
    private MultipartConfigElement multipartConfig;
    //......
    @Override
    protected void configure(ServletRegistration.Dynamic registration) {
        super.configure(registration);
        String[] urlMapping = StringUtils.toStringArray(this.urlMappings);
        if (urlMapping.length == 0 && this.alwaysMapUrl) {
            urlMapping = DEFAULT_MAPPINGS;
        }
        if (!ObjectUtils.isEmpty(urlMapping)) {
            registration.addMapping(urlMapping);
        }
        registration.setLoadOnStartup(this.loadOnStartup);
        if (this.multipartConfig != null) {
            registration.setMultipartConfig(this.multipartConfig);
        }
    }
}
ServletRegistrationBean定義了loadOnStartup屬性,默認為-1,其configure方法會設(shè)置loadOnStartup到ServletRegistration.Dynamic

StandardWrapper

org/apache/catalina/core/StandardWrapper.java

/**
     * Set the load-on-startup order value (negative value means
     * load on first call).
     *
     * @param value New load-on-startup value
     */
    @Override
    public void setLoadOnStartup(int value) {
        int oldLoadOnStartup = this.loadOnStartup;
        this.loadOnStartup = value;
        support.firePropertyChange("loadOnStartup",
                                   Integer.valueOf(oldLoadOnStartup),
                                   Integer.valueOf(this.loadOnStartup));
    }
    /**
     * @return the load-on-startup order value (negative value means
     * load on first call).
     */
    @Override
    public int getLoadOnStartup() {
        if (isJspServlet && loadOnStartup < 0) {
            /*
             * JspServlet must always be preloaded, because its instance is
             * used during registerJMX (when registering the JSP
             * monitoring mbean)
             */
             return Integer.MAX_VALUE;
        } else {
            return this.loadOnStartup;
        }
    }
loadOnStartup屬性最后設(shè)置到了tomcat的StandardWrapper

StandardContext

org/apache/catalina/core/StandardContext.java

/**
     * Load and initialize all servlets marked "load on startup" in the
     * web application deployment descriptor.
     *
     * @param children Array of wrappers for all currently defined
     *  servlets (including those not declared load on startup)
     * @return <code>true</code> if load on startup was considered successful
     */
    public boolean loadOnStartup(Container children[]) {
        // Collect "load on startup" servlets that need to be initialized
        TreeMap<Integer, ArrayList<Wrapper>> map = new TreeMap<>();
        for (Container child : children) {
            Wrapper wrapper = (Wrapper) child;
            int loadOnStartup = wrapper.getLoadOnStartup();
            if (loadOnStartup < 0) {
                continue;
            }
            Integer key = Integer.valueOf(loadOnStartup);
            ArrayList<Wrapper> list = map.get(key);
            if (list == null) {
                list = new ArrayList<>();
                map.put(key, list);
            }
            list.add(wrapper);
        }
        // Load the collected "load on startup" servlets
        for (ArrayList<Wrapper> list : map.values()) {
            for (Wrapper wrapper : list) {
                try {
                    wrapper.load();
                } catch (ServletException e) {
                    getLogger().error(sm.getString("standardContext.loadOnStartup.loadException",
                          getName(), wrapper.getName()), StandardWrapper.getRootCause(e));
                    // NOTE: load errors (including a servlet that throws
                    // UnavailableException from the init() method) are NOT
                    // fatal to application startup
                    // unless failCtxIfServletStartFails="true" is specified
                    if(getComputedFailCtxIfServletStartFails()) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
StandardContext的loadOnStartup方法會取出所有l(wèi)oadOnStartup大于等于0的wrapper,按loadOnStartup值放入到TreeMap<Integer, ArrayList<Wrapper>>,然后遍歷該TreeMap挨個執(zhí)行wrapper.load()進行加載

小結(jié)

springboot的spring.mvc.servlet.load-on-startup屬性,最后設(shè)置到tomcat的StandardWrapper;而tomcat的StandardContext的loadOnStartup方法會取出所有l(wèi)oadOnStartup大于等于0的wrapper,按loadOnStartup值放入到TreeMap<Integer, ArrayList<Wrapper>>,然后遍歷該TreeMap挨個執(zhí)行wrapper.load()進行加載。

以上就是聊聊spring.mvc.servlet.load-on-startup的詳細內(nèi)容,更多關(guān)于spring.mvc.servlet.load-on-startup的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Ribbon核心原理與架構(gòu)深度詳解

    Ribbon核心原理與架構(gòu)深度詳解

    Ribbon是Netflix開源的客戶端負載均衡器,支持服務(wù)發(fā)現(xiàn)、多種負載策略、健康檢查及與SpringCloud集成,適用于微服務(wù)架構(gòu)優(yōu)化調(diào)用性能,未來將與ServiceMesh協(xié)同演進,接下來通過本文給大家介紹Ribbon核心原理與架構(gòu),感興趣的朋友一起看看吧
    2025-08-08
  • JDK8 HashMap擴容機制分析詳解

    JDK8 HashMap擴容機制分析詳解

    這篇文章主要為大家介紹了JDK8 HashMap擴容機制分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • SpringMVC項目訪問controller時候報404的解決

    SpringMVC項目訪問controller時候報404的解決

    這篇文章主要介紹了SpringMVC項目訪問controller時候報404的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot整合Mybatis Generator自動生成代碼

    SpringBoot整合Mybatis Generator自動生成代碼

    SpringBoot 整合 Mybatis Generator自動生成dao、entity、mapper.xml實現(xiàn)單表增刪改查。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java返回json請求中文變成問號的問題及解決

    java返回json請求中文變成問號的問題及解決

    這篇文章主要介紹了java返回json請求中文變成問號的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • MybatisPlus調(diào)用原生SQL的三種方法實例詳解

    MybatisPlus調(diào)用原生SQL的三種方法實例詳解

    這篇文章主要介紹了MybatisPlus調(diào)用原生SQL的三種方法,在有些情況下需要用到MybatisPlus查詢原生SQL,MybatisPlus其實帶有運行原生SQL的方法,我這里列舉三種,需要的朋友可以參考下
    2022-09-09
  • SpringBoot定時任務(wù)的實現(xiàn)詳解

    SpringBoot定時任務(wù)的實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot定時任務(wù)的實現(xiàn)詳解,定時任務(wù)是企業(yè)級開發(fā)中最常見的功能之一,如定時統(tǒng)計訂單數(shù)、數(shù)據(jù)庫備份、定時發(fā)送短信和郵件、定時統(tǒng)計博客訪客等,簡單的定時任務(wù)可以直接通過Spring中的@Scheduled注解來實現(xiàn),需要的朋友可以參考下
    2024-01-01
  • Spring中@Scope的幾種取值方式

    Spring中@Scope的幾種取值方式

    這篇文章主要介紹了Spring中@Scope的幾種取值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java構(gòu)造方法 super 及自定義異常throw合集詳解用法

    Java構(gòu)造方法 super 及自定義異常throw合集詳解用法

    異常是程序中的一些錯誤,但不是所有錯誤都是異常,且錯誤有時候是可以避免的,super可以理解為是指向自己超(父)類對象的一個指針,而這個超類指的是離自己最近的一個父類,構(gòu)造器也叫構(gòu)造方法、構(gòu)造函數(shù),是一種特殊類型的方法,負責類中成員變量(域)的初始化
    2021-10-10
  • JAVA遞歸生成樹形菜單的實現(xiàn)過程

    JAVA遞歸生成樹形菜單的實現(xiàn)過程

    這篇文章主要介紹了JAVA遞歸生成樹形菜單,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01

最新評論

陕西省| 庄浪县| 清苑县| 通江县| 治多县| 东城区| 留坝县| 都江堰市| 山阳县| 正蓝旗| 永寿县| 西充县| 英德市| 津市市| 洮南市| 新疆| 翁源县| 绵竹市| 孟津县| 沁源县| 麻江县| 噶尔县| 义乌市| 志丹县| 巫溪县| 库伦旗| 海口市| 高碑店市| 泗阳县| 盐边县| 北川| 保康县| 南漳县| 兴城市| 河南省| 宁城县| 通山县| 手游| 无为县| 庆阳市| 南和县|