@TOC# 熱門框架系列 記錄在程式走的每一步___auth:huf
從新的篇章開始;篇章閱讀需要先關注; 因為筆者想參與技術文章的評選.;需要一定的粉絲量; 粉絲量達到一定數量.所有文章閱讀限制將會全面放開;謝謝大家的支持
本章節為上一個章節的延續;僅此一章節的延續; 先拋出一個問題;請記住這個問題;之后看完這個篇章應該可以輕松的回答出來;
SpringBoot 既然整合了SpringMVC 那SpringBoot 有沒有子容器?
我們開始這個篇章吧! 在Servlet3.X,我們可以添加 Servlet Filter Listener
我們有兩種方式 一種是注解的方式; @WebServlet @WebFilter @WebListener 還有一種方式 就是 :Spi
spi 是什么?
SPI 我們叫他服務介面擴展,(Service Provider Interface) 直譯服務提供商介面, 不 要被這個名字唬到了, 其實很好理解的一個東西: 其實就是根據Servlet廠商(服務提供商)提供要求的一個介面, 在固定的目錄 (META-INF/services)放上以介面全類名 為命名的檔案, 檔案中放入介面的實作的 全類名,該類由我們自己實作,按照這種約定的方式(即SPI規范),服務提供商會 呼叫檔案中實作類的方法, 從而完成擴展,
在其規范中 我們可以看得到那么一句話: 也就是META-INF/services 路徑下 放一個 javax.servlet.ServletContainerInitailizer 以下我們進入SPI 代碼的實作:
準備一個maven 專案 里面三個子專案 一個Service 一個Client; 還有一個startUp 啟動 我們按照上面的說法 我們在 META-INF/service 路徑下放一個 介面全路徑名的File 檔案 檔案內維護全路徑類名的實作類 以下是測驗結果: SPI 機制就是這樣; 現在很多第三方插件使用的都是SPI機制; 當然Spring也有這樣的機制; 前置知識點 到這里 就鋪墊的差不多了; 如果SPI又疑問的;可以單獨私聊我;
我們細細的往下挖,IDEA創建spring mvc專案 如何創建 可以在其他博主內找到; 以下是需要注意的幾點:
1: 需要配置Tomcat;
Tomcat下載下來 啟動會有亂碼 以下是windows解決亂碼的方案:
在Tomcat的Config里面 logging.properties
修改:
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.encoding = GBK
2:需要配置dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xmlns: context= " http://www.springframework.org/schema/context"
xmlns: mvc= " http://www.springframework.org/schema/cache"
xsi: schemaLocation= " http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd" >
< context: component-scan base-package = " com.huf" > </ context: component-scan>
< bean class = " org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name = " prefix" value = " /" > </ property>
< property name = " suffix" value = " .jsp" > </ property>
</ bean>
< mvc: annotation-driven> </ mvc: annotation-driven>
</ beans>
3:需要配置web.xml
< context-param>
< param-name> contextConfigLocation</ param-name>
< param-value> /WEB-INF/applicationContext.xml</ param-value>
</ context-param>
< listener>
< listener-class> org.springframework.web.context.ContextLoaderListener</ listener-class>
</ listener>
< servlet>
< servlet-name> DispatcherServlet</ servlet-name>
< servlet-class> org.springframework.web.servlet.DispatcherServlet</ servlet-class>
< load-on-startup> 1</ load-on-startup>
</ servlet>
< servlet-mapping>
< servlet-name> DispatcherServlet</ servlet-name>
< url-pattern> *.do</ url-pattern>
</ servlet-mapping>
如果對于這部分代碼配置 或者使用idea 搭建 SpringMVC搭建 專案 程序中 遇到有什么問題 可以私聊我; 因為如果想要追溯 父子容器 那就必須要搭建這么一套東西;
我們在專案中的META-INF.services 添加 javax.servlet.ServletContainerInitializer
SpringMVC 我們分為2塊來看 第一塊 啟動:
我們現在了解了SPI 也配置好了Tomcat 啟動這一塊 我暫時不細說; 后面有專門的文章來說Tomcat; 1:在我們的SPI中 我們有一個類放在META-INF下面:HufSpringServletContainerInitializer
<style>#mermaid-svg-ekr2kNYDm9hlhPKe .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .label text{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .node rect,#mermaid-svg-ekr2kNYDm9hlhPKe .node circle,#mermaid-svg-ekr2kNYDm9hlhPKe .node ellipse,#mermaid-svg-ekr2kNYDm9hlhPKe .node polygon,#mermaid-svg-ekr2kNYDm9hlhPKe .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-ekr2kNYDm9hlhPKe .node .label{text-align:center;fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .node.clickable{cursor:pointer}#mermaid-svg-ekr2kNYDm9hlhPKe .arrowheadPath{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-ekr2kNYDm9hlhPKe .flowchart-link{stroke:#333;fill:none}#mermaid-svg-ekr2kNYDm9hlhPKe .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-ekr2kNYDm9hlhPKe .edgeLabel rect{opacity:0.9}#mermaid-svg-ekr2kNYDm9hlhPKe .edgeLabel span{color:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-ekr2kNYDm9hlhPKe .cluster text{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-ekr2kNYDm9hlhPKe .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-ekr2kNYDm9hlhPKe text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-ekr2kNYDm9hlhPKe .actor-line{stroke:grey}#mermaid-svg-ekr2kNYDm9hlhPKe .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-ekr2kNYDm9hlhPKe #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .sequenceNumber{fill:#fff}#mermaid-svg-ekr2kNYDm9hlhPKe #sequencenumber{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe #crosshead path{fill:#333;stroke:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .messageText{fill:#333;stroke:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-ekr2kNYDm9hlhPKe .labelText,#mermaid-svg-ekr2kNYDm9hlhPKe .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-ekr2kNYDm9hlhPKe .loopText,#mermaid-svg-ekr2kNYDm9hlhPKe .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-ekr2kNYDm9hlhPKe .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-ekr2kNYDm9hlhPKe .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-ekr2kNYDm9hlhPKe .noteText,#mermaid-svg-ekr2kNYDm9hlhPKe .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-ekr2kNYDm9hlhPKe .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-ekr2kNYDm9hlhPKe .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-ekr2kNYDm9hlhPKe .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-ekr2kNYDm9hlhPKe .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .section{stroke:none;opacity:0.2}#mermaid-svg-ekr2kNYDm9hlhPKe .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-ekr2kNYDm9hlhPKe .section2{fill:#fff400}#mermaid-svg-ekr2kNYDm9hlhPKe .section1,#mermaid-svg-ekr2kNYDm9hlhPKe .section3{fill:#fff;opacity:0.2}#mermaid-svg-ekr2kNYDm9hlhPKe .sectionTitle0{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .sectionTitle1{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .sectionTitle2{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .sectionTitle3{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-ekr2kNYDm9hlhPKe .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .grid path{stroke-width:0}#mermaid-svg-ekr2kNYDm9hlhPKe .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-ekr2kNYDm9hlhPKe .task{stroke-width:2}#mermaid-svg-ekr2kNYDm9hlhPKe .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .taskText:not([font-size]){font-size:11px}#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-ekr2kNYDm9hlhPKe .task.clickable{cursor:pointer}#mermaid-svg-ekr2kNYDm9hlhPKe .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-ekr2kNYDm9hlhPKe .taskText0,#mermaid-svg-ekr2kNYDm9hlhPKe .taskText1,#mermaid-svg-ekr2kNYDm9hlhPKe .taskText2,#mermaid-svg-ekr2kNYDm9hlhPKe .taskText3{fill:#fff}#mermaid-svg-ekr2kNYDm9hlhPKe .task0,#mermaid-svg-ekr2kNYDm9hlhPKe .task1,#mermaid-svg-ekr2kNYDm9hlhPKe .task2,#mermaid-svg-ekr2kNYDm9hlhPKe .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutside0,#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutside2{fill:#000}#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutside1,#mermaid-svg-ekr2kNYDm9hlhPKe .taskTextOutside3{fill:#000}#mermaid-svg-ekr2kNYDm9hlhPKe .active0,#mermaid-svg-ekr2kNYDm9hlhPKe .active1,#mermaid-svg-ekr2kNYDm9hlhPKe .active2,#mermaid-svg-ekr2kNYDm9hlhPKe .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-ekr2kNYDm9hlhPKe .activeText0,#mermaid-svg-ekr2kNYDm9hlhPKe .activeText1,#mermaid-svg-ekr2kNYDm9hlhPKe .activeText2,#mermaid-svg-ekr2kNYDm9hlhPKe .activeText3{fill:#000 !important}#mermaid-svg-ekr2kNYDm9hlhPKe .done0,#mermaid-svg-ekr2kNYDm9hlhPKe .done1,#mermaid-svg-ekr2kNYDm9hlhPKe .done2,#mermaid-svg-ekr2kNYDm9hlhPKe .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-ekr2kNYDm9hlhPKe .doneText0,#mermaid-svg-ekr2kNYDm9hlhPKe .doneText1,#mermaid-svg-ekr2kNYDm9hlhPKe .doneText2,#mermaid-svg-ekr2kNYDm9hlhPKe .doneText3{fill:#000 !important}#mermaid-svg-ekr2kNYDm9hlhPKe .crit0,#mermaid-svg-ekr2kNYDm9hlhPKe .crit1,#mermaid-svg-ekr2kNYDm9hlhPKe .crit2,#mermaid-svg-ekr2kNYDm9hlhPKe .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-ekr2kNYDm9hlhPKe .activeCrit0,#mermaid-svg-ekr2kNYDm9hlhPKe .activeCrit1,#mermaid-svg-ekr2kNYDm9hlhPKe .activeCrit2,#mermaid-svg-ekr2kNYDm9hlhPKe .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-ekr2kNYDm9hlhPKe .doneCrit0,#mermaid-svg-ekr2kNYDm9hlhPKe .doneCrit1,#mermaid-svg-ekr2kNYDm9hlhPKe .doneCrit2,#mermaid-svg-ekr2kNYDm9hlhPKe .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-ekr2kNYDm9hlhPKe .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-ekr2kNYDm9hlhPKe .milestoneText{font-style:italic}#mermaid-svg-ekr2kNYDm9hlhPKe .doneCritText0,#mermaid-svg-ekr2kNYDm9hlhPKe .doneCritText1,#mermaid-svg-ekr2kNYDm9hlhPKe .doneCritText2,#mermaid-svg-ekr2kNYDm9hlhPKe .doneCritText3{fill:#000 !important}#mermaid-svg-ekr2kNYDm9hlhPKe .activeCritText0,#mermaid-svg-ekr2kNYDm9hlhPKe .activeCritText1,#mermaid-svg-ekr2kNYDm9hlhPKe .activeCritText2,#mermaid-svg-ekr2kNYDm9hlhPKe .activeCritText3{fill:#000 !important}#mermaid-svg-ekr2kNYDm9hlhPKe .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-ekr2kNYDm9hlhPKe g.classGroup text .title{font-weight:bolder}#mermaid-svg-ekr2kNYDm9hlhPKe g.clickable{cursor:pointer}#mermaid-svg-ekr2kNYDm9hlhPKe g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-ekr2kNYDm9hlhPKe g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-ekr2kNYDm9hlhPKe .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-ekr2kNYDm9hlhPKe .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-ekr2kNYDm9hlhPKe .dashed-line{stroke-dasharray:3}#mermaid-svg-ekr2kNYDm9hlhPKe #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe .commit-id,#mermaid-svg-ekr2kNYDm9hlhPKe .commit-msg,#mermaid-svg-ekr2kNYDm9hlhPKe .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-ekr2kNYDm9hlhPKe g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-ekr2kNYDm9hlhPKe g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-ekr2kNYDm9hlhPKe g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-ekr2kNYDm9hlhPKe .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-ekr2kNYDm9hlhPKe .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-ekr2kNYDm9hlhPKe .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-ekr2kNYDm9hlhPKe .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-ekr2kNYDm9hlhPKe .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-ekr2kNYDm9hlhPKe .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-ekr2kNYDm9hlhPKe .edgeLabel text{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-ekr2kNYDm9hlhPKe .node circle.state-start{fill:black;stroke:black}#mermaid-svg-ekr2kNYDm9hlhPKe .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-ekr2kNYDm9hlhPKe #statediagram-barbEnd{fill:#9370db}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-state .divider{stroke:#9370db}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-ekr2kNYDm9hlhPKe .note-edge{stroke-dasharray:5}#mermaid-svg-ekr2kNYDm9hlhPKe .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-ekr2kNYDm9hlhPKe .error-icon{fill:#522}#mermaid-svg-ekr2kNYDm9hlhPKe .error-text{fill:#522;stroke:#522}#mermaid-svg-ekr2kNYDm9hlhPKe .edge-thickness-normal{stroke-width:2px}#mermaid-svg-ekr2kNYDm9hlhPKe .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-ekr2kNYDm9hlhPKe .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-ekr2kNYDm9hlhPKe .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-ekr2kNYDm9hlhPKe .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-ekr2kNYDm9hlhPKe .marker{fill:#333}#mermaid-svg-ekr2kNYDm9hlhPKe .marker.cross{stroke:#333}
:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}</style>
<style>#mermaid-svg-ekr2kNYDm9hlhPKe {
color: rgba(0, 0, 0, 0.75);
font: ;
}</style>
tomcat啟動
ServletContainerInitializer
SpringServletContainerInitializer
HufSpringServletContainerInitializer.onStartup
之后 我們進入到了AbstractContextLoaderInitializer.onStartup 方法;
繼承自AbstractAnnotationConfigDispatcherServletInitializer
以下是他們的繼承關系
<style>#mermaid-svg-Rzbgi8xZEyiLobHl .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .label text{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .node rect,#mermaid-svg-Rzbgi8xZEyiLobHl .node circle,#mermaid-svg-Rzbgi8xZEyiLobHl .node ellipse,#mermaid-svg-Rzbgi8xZEyiLobHl .node polygon,#mermaid-svg-Rzbgi8xZEyiLobHl .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Rzbgi8xZEyiLobHl .node .label{text-align:center;fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .node.clickable{cursor:pointer}#mermaid-svg-Rzbgi8xZEyiLobHl .arrowheadPath{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Rzbgi8xZEyiLobHl .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Rzbgi8xZEyiLobHl .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Rzbgi8xZEyiLobHl .edgeLabel rect{opacity:0.9}#mermaid-svg-Rzbgi8xZEyiLobHl .edgeLabel span{color:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Rzbgi8xZEyiLobHl .cluster text{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Rzbgi8xZEyiLobHl .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Rzbgi8xZEyiLobHl text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Rzbgi8xZEyiLobHl .actor-line{stroke:grey}#mermaid-svg-Rzbgi8xZEyiLobHl .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Rzbgi8xZEyiLobHl #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .sequenceNumber{fill:#fff}#mermaid-svg-Rzbgi8xZEyiLobHl #sequencenumber{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .messageText{fill:#333;stroke:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Rzbgi8xZEyiLobHl .labelText,#mermaid-svg-Rzbgi8xZEyiLobHl .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Rzbgi8xZEyiLobHl .loopText,#mermaid-svg-Rzbgi8xZEyiLobHl .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Rzbgi8xZEyiLobHl .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Rzbgi8xZEyiLobHl .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Rzbgi8xZEyiLobHl .noteText,#mermaid-svg-Rzbgi8xZEyiLobHl .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Rzbgi8xZEyiLobHl .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Rzbgi8xZEyiLobHl .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Rzbgi8xZEyiLobHl .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Rzbgi8xZEyiLobHl .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .section{stroke:none;opacity:0.2}#mermaid-svg-Rzbgi8xZEyiLobHl .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Rzbgi8xZEyiLobHl .section2{fill:#fff400}#mermaid-svg-Rzbgi8xZEyiLobHl .section1,#mermaid-svg-Rzbgi8xZEyiLobHl .section3{fill:#fff;opacity:0.2}#mermaid-svg-Rzbgi8xZEyiLobHl .sectionTitle0{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .sectionTitle1{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .sectionTitle2{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .sectionTitle3{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Rzbgi8xZEyiLobHl .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .grid path{stroke-width:0}#mermaid-svg-Rzbgi8xZEyiLobHl .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Rzbgi8xZEyiLobHl .task{stroke-width:2}#mermaid-svg-Rzbgi8xZEyiLobHl .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .taskText:not([font-size]){font-size:11px}#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Rzbgi8xZEyiLobHl .task.clickable{cursor:pointer}#mermaid-svg-Rzbgi8xZEyiLobHl .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Rzbgi8xZEyiLobHl .taskText0,#mermaid-svg-Rzbgi8xZEyiLobHl .taskText1,#mermaid-svg-Rzbgi8xZEyiLobHl .taskText2,#mermaid-svg-Rzbgi8xZEyiLobHl .taskText3{fill:#fff}#mermaid-svg-Rzbgi8xZEyiLobHl .task0,#mermaid-svg-Rzbgi8xZEyiLobHl .task1,#mermaid-svg-Rzbgi8xZEyiLobHl .task2,#mermaid-svg-Rzbgi8xZEyiLobHl .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutside0,#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutside2{fill:#000}#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutside1,#mermaid-svg-Rzbgi8xZEyiLobHl .taskTextOutside3{fill:#000}#mermaid-svg-Rzbgi8xZEyiLobHl .active0,#mermaid-svg-Rzbgi8xZEyiLobHl .active1,#mermaid-svg-Rzbgi8xZEyiLobHl .active2,#mermaid-svg-Rzbgi8xZEyiLobHl .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Rzbgi8xZEyiLobHl .activeText0,#mermaid-svg-Rzbgi8xZEyiLobHl .activeText1,#mermaid-svg-Rzbgi8xZEyiLobHl .activeText2,#mermaid-svg-Rzbgi8xZEyiLobHl .activeText3{fill:#000 !important}#mermaid-svg-Rzbgi8xZEyiLobHl .done0,#mermaid-svg-Rzbgi8xZEyiLobHl .done1,#mermaid-svg-Rzbgi8xZEyiLobHl .done2,#mermaid-svg-Rzbgi8xZEyiLobHl .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Rzbgi8xZEyiLobHl .doneText0,#mermaid-svg-Rzbgi8xZEyiLobHl .doneText1,#mermaid-svg-Rzbgi8xZEyiLobHl .doneText2,#mermaid-svg-Rzbgi8xZEyiLobHl .doneText3{fill:#000 !important}#mermaid-svg-Rzbgi8xZEyiLobHl .crit0,#mermaid-svg-Rzbgi8xZEyiLobHl .crit1,#mermaid-svg-Rzbgi8xZEyiLobHl .crit2,#mermaid-svg-Rzbgi8xZEyiLobHl .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Rzbgi8xZEyiLobHl .activeCrit0,#mermaid-svg-Rzbgi8xZEyiLobHl .activeCrit1,#mermaid-svg-Rzbgi8xZEyiLobHl .activeCrit2,#mermaid-svg-Rzbgi8xZEyiLobHl .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Rzbgi8xZEyiLobHl .doneCrit0,#mermaid-svg-Rzbgi8xZEyiLobHl .doneCrit1,#mermaid-svg-Rzbgi8xZEyiLobHl .doneCrit2,#mermaid-svg-Rzbgi8xZEyiLobHl .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Rzbgi8xZEyiLobHl .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Rzbgi8xZEyiLobHl .milestoneText{font-style:italic}#mermaid-svg-Rzbgi8xZEyiLobHl .doneCritText0,#mermaid-svg-Rzbgi8xZEyiLobHl .doneCritText1,#mermaid-svg-Rzbgi8xZEyiLobHl .doneCritText2,#mermaid-svg-Rzbgi8xZEyiLobHl .doneCritText3{fill:#000 !important}#mermaid-svg-Rzbgi8xZEyiLobHl .activeCritText0,#mermaid-svg-Rzbgi8xZEyiLobHl .activeCritText1,#mermaid-svg-Rzbgi8xZEyiLobHl .activeCritText2,#mermaid-svg-Rzbgi8xZEyiLobHl .activeCritText3{fill:#000 !important}#mermaid-svg-Rzbgi8xZEyiLobHl .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Rzbgi8xZEyiLobHl g.classGroup text .title{font-weight:bolder}#mermaid-svg-Rzbgi8xZEyiLobHl g.clickable{cursor:pointer}#mermaid-svg-Rzbgi8xZEyiLobHl g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Rzbgi8xZEyiLobHl g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Rzbgi8xZEyiLobHl .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Rzbgi8xZEyiLobHl .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Rzbgi8xZEyiLobHl .dashed-line{stroke-dasharray:3}#mermaid-svg-Rzbgi8xZEyiLobHl #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl .commit-id,#mermaid-svg-Rzbgi8xZEyiLobHl .commit-msg,#mermaid-svg-Rzbgi8xZEyiLobHl .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Rzbgi8xZEyiLobHl g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Rzbgi8xZEyiLobHl g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Rzbgi8xZEyiLobHl g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Rzbgi8xZEyiLobHl .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Rzbgi8xZEyiLobHl .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Rzbgi8xZEyiLobHl .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Rzbgi8xZEyiLobHl .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Rzbgi8xZEyiLobHl .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Rzbgi8xZEyiLobHl .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Rzbgi8xZEyiLobHl .edgeLabel text{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Rzbgi8xZEyiLobHl .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Rzbgi8xZEyiLobHl .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Rzbgi8xZEyiLobHl #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Rzbgi8xZEyiLobHl .note-edge{stroke-dasharray:5}#mermaid-svg-Rzbgi8xZEyiLobHl .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Rzbgi8xZEyiLobHl .error-icon{fill:#522}#mermaid-svg-Rzbgi8xZEyiLobHl .error-text{fill:#522;stroke:#522}#mermaid-svg-Rzbgi8xZEyiLobHl .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Rzbgi8xZEyiLobHl .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Rzbgi8xZEyiLobHl .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Rzbgi8xZEyiLobHl .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Rzbgi8xZEyiLobHl .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Rzbgi8xZEyiLobHl .marker{fill:#333}#mermaid-svg-Rzbgi8xZEyiLobHl .marker.cross{stroke:#333}
:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}</style>
<style>#mermaid-svg-Rzbgi8xZEyiLobHl {
color: rgba(0, 0, 0, 0.75);
font: ;
}</style>
AbstractAnnotationConfigDispatcherServletInitializer
AbstractDispatcherServletInitializer
AbstractContextLoaderInitializer
以上的鋪墊 全部都是為了引出 加載容器方法; 我們聯合起來的邏輯:
我們知道 在子類沒有onStartup方法 就會往父類中去尋找:
我們再AbstractDispatcherServletInitializer.onStartup方法中;我們可以發現; 這里 就準備開始創建我們的父容器; 點進去;
開始創建我們的父容器; 繼續往里面看 開始注冊我們的父容器; 只有register 沒有refresh(); 這里我們就可以發現 這里僅僅是做了一個準備作業 容器并沒有啟動;最后回傳一個容器;
創建一個監聽器;
新創建一個監聽器 然后把監聽器 方到Listener里面;父容器到這里就階段性結束了;然后回到 AbstractDispatcherServletInitializer.onStartup()方法中 代碼部分 我就不一句一句去解釋了 這里代碼非常簡單;如果喜歡看我博客的同學 應該都沒很大問題;
這里記住 Tomcat會繼續往下執行代碼; 這時候會調起一個 ContextLoaderListener的contextInitialized 方法; 我們繼續點進去看一下;
tomcat會繼續往下執行 會調起 DispatcherServlet.init 方法 這里再上一篇文章中我寫有寫一部分;
重點關注這個方法;
protected WebApplicationContext initWebApplicationContext ( ) {
從域中提取出父容器;
WebApplicationContext rootContext = WebApplicationContextUtils . getWebApplicationContext ( getServletContext ( ) ) ;
WebApplicationContext wac = null ;
if ( this . webApplicationContext != null ) {
wac = this . webApplicationContext;
if ( wac instanceof ConfigurableWebApplicationContext ) {
ConfigurableWebApplicationContext cwac = ( ConfigurableWebApplicationContext ) wac;
if ( ! cwac. isActive ( ) ) {
if ( cwac. getParent ( ) == null ) {
設定父容器
cwac. setParent ( rootContext) ;
}
開始初始化容器; 再上圖中 進行 refresh
configureAndRefreshWebApplicationContext ( cwac) ;
}
}
}
if ( wac == null ) {
wac = findWebApplicationContext ( ) ;
}
if ( wac == null ) {
wac = createWebApplicationContext ( rootContext) ;
}
if ( ! this . refreshEventReceived) {
synchronized ( this . onRefreshMonitor) {
開始初始化Servlet 里面的 組件
/**
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
**/
onRefresh ( wac) ;
}
}
if ( this . publishContext) {
String attrName = getServletContextAttributeName ( ) ;
getServletContext ( ) . setAttribute ( attrName, wac) ;
}
return wac;
}
這邊 我們就已經把 SpringMVC的父子容器全部解釋清楚了:
總結
1:Tomcat在啟動時會通過SPI注冊 ContextLoaderListener和DispatcherServlet物件,同時創建父子容器 :分別創建在ContextLoaderListener初始化時創建父 容器設定配置類;在DispatcherServlet初始化時創建子容器 即2個 ApplicationContext實體設定配置類
2: Tomcat在啟動時執行ContextLoaderListener和DispatcherServlet物件的初始化方 法, 執行容器refresh進行加載
3:在子容器加載時 創建SpringMVC所需的Bean和預準備的資料;
4: 子容器需要注入父容器的Bean時(比如Controller中需要@Autowired Service的Bean); 會先從子容器中找,沒找到會去父容器中找: 詳情見 AbstractBeanFactory#doGetBean方法
一般情況下,只有Spring和SpringMvc整合的時才會有父子容器的概念,
作用:比如我們的Controller中注入Service的時候,
發現我們依賴的是一個參考物件,
那么他就 會呼叫getBean去把service找出來;
但是當前所在的容器是web子容器,
那么就會在這里的 先去父容器找
回到我們 文章當中的那個問題:
SpringBoot 沒有父子容器;原因如下
父子容器的定義: 1.早期Spring為了劃分框架邊界,service、dao層我們一般使用spring框架來管理、controller 層交給springmvc管理; 2.規范整體架構 使 父容器service無法訪問子容器controller、子容器 controller可以訪問父容器 service、 3.方便子容器的切換,如果現在我們想把web層從spring mvc替換成struts, 那么只需要將spring-mvc.xml替換成Struts的組態檔struts.xml即可,而 spring-core.xml不需要改變