




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 Webx框架初始化解析前言:對(duì)整個(gè)webx框架的初始化進(jìn)行了全面的分析,webx是怎么一步一步的初始化的,組件與組件時(shí)間如何相互通信,web層怎么能夠方便的拿到service的東西,service的資源存在什么地方;外部程序怎樣拿到webxcontroller的實(shí)例;又怎樣保證car與car之間的獨(dú)立,car與car之間又是怎么共享資源的,configration在整個(gè)環(huán)境是怎么起到核心作用的;希望這樣的文章會(huì)對(duì)大家有所幫助;主要是分析wex框架的內(nèi)部初始化情況,和結(jié)構(gòu)分析;(1):com.alibaba.webx.WebxControllerServlet為整個(gè)系統(tǒng)的門面,初始化工作也在這
2、里進(jìn)行; web.xml里面:michael已經(jīng)說的很清楚webx主控制器;<!- Webx主控制器。 -><servlet-name>WebxController</servlet-name><servlet-class>com.alibaba.webx.WebxControllerServlet</servlet-class>WebxControllerServlet繼承com.alibaba.webx.controller.AbstractWebxControllerServlet;AbstractWebxControllerS
3、ervlet繼承自HttpServlet;容器啟動(dòng)的時(shí)候,因?yàn)閃ebxController的啟動(dòng)狀態(tài)是<load-on-startup>1</load-on-startup>,所以直接執(zhí)行WebxControllerServlet按照servlet的規(guī)范首先執(zhí)行init();WebxControllerServlet直接執(zhí)行父類AbstractWebxControllerServlet的init();public void init() throws ServletException try configure();("WebxControll
4、er: init() Ready to Rumble!"); catch (Exception e) log.error("WebxController: init() failed", e);/ 這個(gè)異常將被servlet engine記錄到servlet log中。UnavailableException ue = new UnavailableException("WebxController: init() failed: " + e.getMessage();ue.initCause(e);throw ue; 以上又是一個(gè)比較經(jīng)典的模
5、板應(yīng)用,init()方法里面執(zhí)行 configure()方法,但是AbstractWebxControllerServlet定義的configure十一個(gè)抽象方法:protected abstract void configure() throws WebxInitializationException;并且由子類實(shí)現(xiàn),所以直接執(zhí)行子類的configure();具體業(yè)務(wù)邏輯子類化;1 / 16WebxControllerServlet的configure()方法中主要進(jìn)行兩個(gè)操作,一初始化WebxController,二將相關(guān)的servletConfig對(duì)象放到ServletContext中;
6、WebxControllerServlet中屬性 private WebxController controller;光看名字就知道十一個(gè)比較重要的對(duì)象;所以時(shí)刻要注意它;分析configure():protected void configure() throws WebxInitializationException controller = WebxUtil.getWebxController(getServletContext();if (controller = null) WebxLoader loader = new WebxLoader(log, getServletConte
7、xt(), getServletConfig();loader.configure();controller = loader;/ 將servletConfig放在servletContext中,供rundata filter使用。getServletContext().setAttribute(WEBX_CONTROLLER_SERVLET_CONFIG_KEY, getServletConfig();這里首先用WebxUtil工具類根據(jù)ServletContex對(duì)象來初始化controller;調(diào)用WebxUtil的public static WebxController getWebxC
8、ontroller(ServletContext context);請(qǐng)看具體方法: public static WebxController getWebxController(ServletContext context) WebxController controller = null;try Reference holder = (Reference) context.getAttribute(WEBX_CONTROLLER_KEY);/context里面并沒有這個(gè)屬性,這里拿出來應(yīng)該是空的;controller = (WebxController) holder.get(); catc
9、h (ClassCastException e) catch (NullPointerException e) return controller;這里返回的controller應(yīng)該是空的,因?yàn)閏ontext里面沒有注入“webx.controller”屬性;接下來應(yīng)該執(zhí)行: WebxLoader loader = new WebxLoader(log, getServletContext(), getServletConfig();WebxLoader 實(shí)現(xiàn)了 com.alibaba.webx.controller.WebxController和com.alibaba.webx.WebxCo
10、nstantcom.alibaba.webx.controller.WebxController是webx框架的核心調(diào)度者,是mvc框架的入口,它里面包含了獲取大量資源的方法,需要用的上下文對(duì)象都在接口里面提供了的;例如可以通過接口拿到:ServletContext,ServiceManager(service管理器),Scheme(scheme方案初始化配置的方案),RunDataService(RunData服務(wù)),ThreadContextService(線程范圍的singleton服務(wù)),WebxComponent等信息; com.alibaba.webx.WebxConstant包含
11、一些配置信息,關(guān)于webxfreamwork的常量定義;現(xiàn)在我們應(yīng)該看一下實(shí)現(xiàn)類是怎么的結(jié)構(gòu),以及它是怎樣工作的;com.alibaba.webx.WebxLoader首先通過構(gòu)造函數(shù)進(jìn)行初始化,傳入日志對(duì)象,servlet上下文對(duì)象,servletConfig對(duì)象;WebxLoader loader = new WebxLoader(log, getServletContext(), getServletConfig();loader 初始化成功之后,執(zhí)行 loader.configure();這一步是初始化了webx的所有配置;接下來可能要花大量的篇幅講解很多初始化工作雖然有點(diǎn)枯燥;(2)
12、真正的controller是怎樣產(chǎn)生的:在這里要注意看注釋的編號(hào)對(duì)應(yīng)下面的具體解釋;WebxLoader的configure() public void configure() throws WebxInitializationException /*(一)創(chuàng)建日志輸出路徑,看后面的注解*/File loggingRoot = configureLoggingRoot(); /*(二)初始化 WebappBootstrapResourceLoaderService *WebappBootstrapResourceLoaderService resourceLoader = new Webapp
13、BootstrapResourceLoaderService(servletContext);/ 在配置文件中可以使用如下變量:/ $loggingRoot/ $server.host/ $server.addr/ 以及所有System.getProperties()中的變量Properties props = new Properties(System.getProperties(); /*(三)為配置log4j,取出相關(guān)屬性*/props.setProperty(LOGGING_ROOT_KEY, loggingRoot.getAbsolutePath();props.setPropert
14、y(LOCAL_HOST_KEY, SystemUtil.getHostInfo().getName();props.setProperty(LOCAL_ADDRESS_KEY, SystemUtil.getHostInfo().getAddress();/*(四) 配置log4j日志系統(tǒng)。*/configureLog4j(resourceLoader, props);/ 現(xiàn)在,logging系統(tǒng)應(yīng)該已經(jīng)可以工作了。("=");("Logging root is " + loggingRoot);/*(五)取得scheme
15、的實(shí)例*/scheme = configureScheme(resourceLoader);/*(六)取得規(guī)格化的servletPaths*/servletPaths = configureServletPaths();/*(七)取得webx配置文件*/Configuration configuration = configureWebx(resourceLoader, props, scheme);/*(八)設(shè)置默認(rèn)的services和配置項(xiàng)*/scheme.applyDefaultConfiguration(resourceLoader, configuration, props);if
16、(log.isDebugEnabled() log.debug("WebxController initialized with configuration: n"+ (ConfigurationUtil.list(configuration);/*(九)初始化service manager*/serviceManager = configureServiceManager(resourceLoader, configuration, scheme);/*(十)其它有關(guān)WebxController配置*/configureWebxController();/*(十一)如果指
17、定了initAllServices,則強(qiáng)制初始化所有services*/configureAllServices(); 注解:(一)創(chuàng)建日志輸出路徑的目錄,這里有三種策率,第一種是默認(rèn)策率,首先會(huì)取你的user.home,我的user.home是:C:Documents and Settingsliangkuan,然后用user.home+/.webx+ServletName+/logs,最終中生成的路徑是C:Documents and Settingsliangkuan.webxWebxControllerlogs+log4j.xml中配置的路徑變量。以我本機(jī)為例;但是構(gòu)建目錄的時(shí)候首先會(huì)去
18、尋找servletConfig里面關(guān)于日志的配置參數(shù),來決定路徑,如果在servletConfig中沒有找到的話,會(huì)去servletContext里面找配置參數(shù),如果兩者都沒有找到就會(huì)直接用第一種默認(rèn)策率來作為日志輸出路徑,相當(dāng)靈活;以我的環(huán)境為例,因?yàn)槲业膕ervlet里面配置了 <init-param><param-name>loggingRoot</param-name><param-value>$fortuna_loggingRoot</param-value><!-這個(gè)參數(shù)是會(huì)在perty文件里面注入的
19、-></init-param>所以直接就會(huì)在servletConfig里面找;實(shí)現(xiàn)用到的相關(guān)類和:WebxLoader.configureLoggingRoot(),.findInitParameter(),mon.lang.SystemUtil的getHomeDir();(二)初始化WebappBootstrapResourceLoaderService 簡(jiǎn)單講下WebappBootstrapResourceLoaderService 的結(jié)構(gòu)WebappBootstrapResourceLoaderService 繼承com.alibaba.service.resource
20、.BootstrapResourceLoaderServiceBootstrapResourceLoaderService實(shí)現(xiàn)com.alibaba.service.resourceResourceLoaderService,com.alibaba.service.MultiInstance;(實(shí)現(xiàn)它可以有多個(gè)實(shí)例)這個(gè)初始化操作只做了3個(gè)事情: 1:執(zhí)行父類的非缺省構(gòu)造函數(shù),進(jìn)本上什么都沒有做;2:setLoggerReady(false),設(shè)置日志并沒有準(zhǔn)備好;3:傳入servletContext屬性;this.servletContext = servletContext;這是一個(gè)功能強(qiáng)
21、大的資源裝載器;可以讀取各種資源,例如url,file等;這里的資源裝載器主要是針對(duì)web應(yīng)用的資源裝載器實(shí)例;(三)將和log4j相關(guān)的屬性裝入資源文件;LOGGING_ROOT_KEY對(duì)應(yīng)的是日志輸出的地址,LOCAL_HOST_KEY對(duì)應(yīng)的是主機(jī)名,LOCAL_ADDRESS_KEY對(duì)應(yīng)的是ip地址;都是通過InetAddress取出地址相關(guān)屬性的,對(duì)這個(gè)些類不熟悉可以去看一下網(wǎng)絡(luò)編程;在SystemUtil里面使用了幾個(gè)靜態(tài)內(nèi)部類,并且構(gòu)造函數(shù)都是私有的,主要是防止外面直接創(chuàng)建;(四)配置log4j應(yīng)用configureLog4j(resourceLoader, props);這里傳入
22、了資源裝載器,和相關(guān)的資源文件;首先要取出log4j配置文件的路徑,這里還是三種策率:(1)如果servletConfig里面有配置文件的引用路徑優(yōu)先考慮;(2)如果servletConfig里面沒有直接在servletContext里面尋找;(3)如果servletContext里面也不能找到直接用缺省配置/WEB-INF/log4j.xml;接下來把路徑生成相關(guān)的url對(duì)象;然后把文件取出來;這里對(duì)log4j的配置文件有兩種解析方式,如果配置文件名為*.xml,則使用DOMConfigurator,否則使用PropertyConfigurator?,F(xiàn)在log4j可以工作了所以進(jìn)行下面操作
23、resourceLoader.setLoggerReady(true);現(xiàn)在打日志就沒有問題了;(五)取得Scheme的實(shí)例 首先取得schemeName 先在servletConfig里面找如果沒有去servletContext 里面找如果都沒有找到暫時(shí)為turbine;構(gòu)造一個(gè)名為webx.scheme.turbine的serviceId,這里的serviceId是一個(gè)文件的名字;這個(gè)文件里面存有一條信息com.alibaba.turbine.scheme.TurbineScheme,從這里應(yīng)該看出來這是一個(gè)類的全名,并且可能是Scheme的實(shí)現(xiàn)類;接下來ClassLoaderUtil來裝
24、載這個(gè)類,ClassLoaderUtil.loadServiceClass(serviceId)這個(gè)方法指定了當(dāng)前線程的類裝載器來裝載這個(gè)類;在這里構(gòu)造了一個(gè)完整的路徑名:META-INF/services/webx/scheme/turbine,并且用當(dāng)前的類裝載器的getResource()方法把文件路徑轉(zhuǎn)換成url,然后直接把輸入流打開;得到一個(gè)完整類名,并且用當(dāng)前類裝載器把com.alibaba.turbine.scheme.TurbineScheme裝載;個(gè)人覺得這樣的實(shí)現(xiàn)有點(diǎn)麻煩;類裝載之后實(shí)例化com.alibaba.turbine.scheme.TurbineScheme;關(guān)于
25、TurbineScheme Michael在注釋中寫到經(jīng)典的webx方案,可見它的重要性,在后面使用到它的地方將為大家介紹;(六)取得 取得web.xml中定義的servlet paths,并規(guī)格化之,讓我們拿出的請(qǐng)求路徑更加有規(guī)律;這里會(huì)在servletConfig,servletContext 去找webx.servlet.paths如果找不到缺省為空字符串;根據(jù)我這里的上下文路徑這里沒有這個(gè)參數(shù);(七)Configuration配置對(duì)象的接口,Configuration configuration = configureWebx(resourceLoader, props, scheme
26、);這里要去找一個(gè)webxConfiguration的配置路徑,首先在servletConfig,servletContext去找初始化參數(shù)webx.configuration,如果都沒有找到的話使用缺省值 webxConfiguration=/WEB-INF/webx.xml而在當(dāng)前系統(tǒng)中用的是缺省配置;用web資源裝載器得到/WEB-INF/webx.xml對(duì)應(yīng)的url;從這個(gè)配置文件的名稱應(yīng)該可以看出這里拉出了webx初始化的開端;接下來讀取webx配置文件,將配置文件映射為Configuration對(duì)象,接下來會(huì)在servletConfig,servletContext中去找參數(shù)web
27、x.configuration.loader.class如果找不到的話就以默認(rèn)值com.alibaba.webx.configuration.WebxConfigurationLoader為使用類;WebxConfigurationLoader調(diào)用了JellyDigester的parse();這里聲明了一個(gè)內(nèi)部類 private class DefaultJellyContext extends JellyContext configuration 最終是通過Jelly引擎解析出來的;Jelly是一種基于java的腳本引擎,提供了解析xml的功能,它還具有比較強(qiáng)的動(dòng)態(tài)特性;接下來在web.xm
28、l中取出ponents,這里是在servletContext中取到的,取出了六個(gè)組件auction, member, mytaobao, common, shop, message并且為每一個(gè)組件也就是car包分配一個(gè)資源裝載器的實(shí)例;實(shí)現(xiàn)代碼如下:ResourceLoaderService componentResourceLoader = (ResourceLoaderService) resourceLoader.getInstance(componentName);根據(jù)配置將每一個(gè)組件的配置文件轉(zhuǎn)換成Configuration,并且和主要的Configuration對(duì)象進(jìn)行合并,具體實(shí)
29、現(xiàn)代碼如下:car包下的Configuration合并到總的Configuration時(shí),key全部變?yōu)閏ar包的componentname+key值;public static void loadComponent(Configuration configuration, String componentName,String className, URL url, Map properties) throws DigesterException Configuration componentConfiguration = load(className, url, properties);/
30、 將componentName加入到services.instances中,確保不重復(fù)。if(!configuration.getList(ServiceManager.SERVICE_INSTANCES_KEY).contains(componentName) configuration.addProperty(ServiceManager.SERVICE_INSTANCES_KEY, componentName);/ 將component配置加入到主配置中。ConfigurationUtil.merge(configuration, componentConfiguration, comp
31、onentName);(八):調(diào)用com.alibaba.turbine.scheme.TurbineScheme的applyDefaultConfiguration()方法;這一步主要是初始化webx的默認(rèn)配置;將相關(guān)配置文件里面配置的信息加入到Configuration中;1:首先將webx-default.xml中的配置合并到總的configuration對(duì)象中,具體步驟如下:用web資源裝載器尋找/WEB-INF/webx-default.xml如果這個(gè)文件存在,生成對(duì)應(yīng)于/WEB-INF/webx-default.xml的Configuration;生成Configuration都是
32、用的Jelly來解析xml生成的Configuration對(duì)象;第一步將configuration對(duì)象里面標(biāo)記為services的配置信息讀取出來,根據(jù)configuration的規(guī)則,只搜索根目錄下面一級(jí)的services標(biāo)記例如:<configuration><services><service name="RunDataService" class="com.alibaba.webx.service.rundata.DefaultRunDataService"><property name="re
33、quest.buffered.class"value="com.alibaba.webx.request.context.buffered.BufferedRequestContextFactory"/> </service><service name="PullService" class="com.alibaba.service.pull.DefaultPullService"><property name="tool.global"><property
34、 name="util" value="com.alibaba.service.pull.LangToolSet"/></property></service></services><instance name="component"><services><service name="liuzh" class="com.alibaba.webx.service.rundata.DefaultRunDataService"&g
35、t;<property name="request.buffered.class"value="com.alibaba.webx.request.context.buffered.BufferedRequestContextFactory"/> </service><service name="liangkuan" class="com.alibaba.webx.service.rundata.DefaultRunDataService"/></services>&l
36、t;/instance></configuration>根據(jù)上面例子取出來的是RunDataService,PullService,把這些值放到set里面;然后迭代這個(gè)set對(duì)象,以services為前綴,set里面取出的值;拼成的值類似于services.RunDataService最終以拼裝的值為key在defaultConfiguration將相關(guān)屬性取出,全部合并到總的Configuration中;在這里如果總的Configuration里面的配置和缺省Configuration的配置的key一樣的話,忽略缺省Configuration的配置,不進(jìn)行合并;在webx框
37、架有一個(gè)優(yōu)先級(jí),默認(rèn)是以webx-defaut.xml的配置為準(zhǔn),如果webx.xml的配置和webx-defaut.xml的配置相同以webx.xml為準(zhǔn);各car包下面的配置不會(huì)和以上兩個(gè)文件的配置產(chǎn)生沖突;2:將缺省對(duì)象中key為component.services對(duì)應(yīng)的配置信息讀取出來;以上面的配置文件信息為例,根據(jù)解析,最終得到一個(gè)set,這個(gè)set里面包含的數(shù)據(jù)是(liuzh,liangkuan);循環(huán)set 以liuzh為例拼裝成component.services.liuzh,并且將defaultConfiguration對(duì)應(yīng)的值取出來,組合到總的Configuration中;
38、這里添加的key的規(guī)則是instanceName + "." + serviceKey + "." + defaultKey;參見具體代碼:Configuration defaultConfiguration, String serviceName, boolean isSubInstance) StringserviceKey = ServiceManager.SERVICE_PREFIX + "." + serviceName;boolean standalone = true;if (isSubInstance) / 如果isS
39、ubInstance,表示對(duì)每個(gè)instance設(shè)置默認(rèn)值。/ 將instance.services.ServiceName.*設(shè)置到每個(gè)instanceName.services.ServiceName中for (Iterator i = configuration.getList(ServiceManager.SERVICE_INSTANCES_KEY).iterator(); i.hasNext();) standalone = false;StringinstanceName= (String) i.next();Configuration serviceConfiguration =
40、 defaultConfiguration.subset(WEBX_CONFIGURATION_DEFAULT_INSTANCE+ "." + serviceKey);for (Iterator keys = serviceConfiguration.getKeys(); keys.hasNext();) String defaultKey = (String) keys.next();String key = instanceName + "." + serviceKey + "." + defaultKey;if (!config
41、uration.containsKey(key) configuration.addProperty(key, serviceConfiguration.getProperty(defaultKey); if (log.isDebugEnabled() log.debug("Added default configuration for service " + serviceName + "."+ instanceName);defaultConfiguration = defaultConfiguration.subset(WEBX_CONFIGURA
42、TION_DEFAULT_INSTANCE);3:加入其它非service的默認(rèn)主配置:main-instance,加入其它非service的默認(rèn)配置:sub-instances。4:將/classpath/com/alibaba/turbine/scheme/webx-turbine-default.xml的配置信息合并到總的Configuration;這個(gè)配置文件的優(yōu)先級(jí)是最低的,如果前面沒有配置和webx-turbine-default.xml相同的配置,將使用webx-turbine-default.xml里面配置的服務(wù);5:加載/classpath/com/alibaba/webx/
43、scheme/webx-default.xml配置的信息到總的Configuration里面了;接下來組合一個(gè)keyservices.ThreadContextService.factory.default 做了下面操作;if (!configuration.getList(key).contains(RunDataObjectFactory.class.getName() configuration.addProperty(key, RunDataObjectFactory.class.getName();(九):初始化ServiceManager第一步找到ServiceManager的默認(rèn)
44、實(shí)現(xiàn)類首先會(huì)在servletconfig里面尋找參數(shù)名為service.manager.class對(duì)應(yīng)的值,如果沒有找到去servletcontext里面去找,如果都沒有找到以com.alibaba.webx.service.DefaultWebxServiceManager作為ServiceManager的實(shí)現(xiàn)類DefaultServiceManager是DefaultWebxServiceManager的父類;得到ServiceManager的實(shí)例以后把資源裝載,和總的configration注入到manager中,讓ServiceManager可以方便調(diào)用這些屬性;接下來調(diào)用manage
45、r的init(),實(shí)際上是調(diào)用的DefaultServiceManager的init方法;首先調(diào)用initMapping();通過 configuration.getStringArray(services.instances)取出一個(gè)admin, member, auction, auxiliary, crm, support, product數(shù)組;這個(gè)數(shù)組里面存儲(chǔ)的是所有的car的名字,根據(jù)數(shù)組長(zhǎng)度循環(huán),configuration.subset(instanceName)取出每個(gè)car下面的configuration然后以實(shí)例名為key,具體car包下的configration為value
46、放入map中,這樣就把每個(gè)car包下的配置獨(dú)立開來了;接下來找出每一個(gè)service的名字并且根據(jù)為每一個(gè)service配置一個(gè)初始化一個(gè)ServiceInstance,并且把每一個(gè)service對(duì)應(yīng)的configration 注入到ServiceInstance中,這樣每個(gè)service可以方便的找到屬于自己的configration;然后將每一個(gè)ServiceInstance 以instancekey為key ServiceInstance為value放入一個(gè)map中,讓ServiceManager以后可以通過相關(guān)key輕松拿到對(duì)應(yīng)service的所有信息;instancekey的構(gòu)造規(guī)則
47、,如果是主配置的話直接是service的名字,如果是car下面的配置的話為car的名字加上service的名字下一步為初始化resource loader services;這里可以分析下怎么取到service的,一般是調(diào)用manager的getService(String serviceName, String instanceName)首先根據(jù)serviceName和instanceName取得相關(guān)service的ServiceInstance 對(duì)象;如果這里不是car包里面的service第二個(gè)參數(shù)傳null;這里manager把serviceName,instanceName組合成in
48、stancekey給據(jù)這個(gè)key在map里面取出ServiceInstance;拿到ServiceInstance的實(shí)例之后,調(diào)用manager.initService(ServiceInstance,false)ServiceInstance是DefaultServiceManager的一個(gè)內(nèi)部類;這里實(shí)際上是調(diào)用的ServiceInstance的getInstance()方法,因?yàn)镾erviceInstance正好對(duì)應(yīng)一個(gè)service;getInstance()方法是一個(gè)同步方法,防止不同的線程都在初始化ServiceInstance,這樣保證了ServiceInstance,首先判斷
49、ServiceInstance里面的service屬性是否為空的,如果service已經(jīng)初始化了直接返回service的實(shí)例,所有我們自定義的service是繼承于Service接口的;這里避免了反復(fù)初始化service,讓我們拿到的service都是同一個(gè)實(shí)例;接下來在service對(duì)應(yīng)的configration中把當(dāng)前service對(duì)應(yīng)的calssname取出來;這里在得實(shí)例話service的時(shí)候有多種策率,如果是主配置,直接拿到class然后執(zhí)行newInstance();在這里實(shí)現(xiàn)了service的單例和多例;得到service的實(shí)例以后執(zhí)行service的init(),將Servic
50、eInstance參數(shù)傳給init(),這樣每個(gè)service可以方便的拿到自己的實(shí)例;最后執(zhí)行了initServices();這一步是將需要在啟動(dòng)容器初始化的service進(jìn)行初始化;首先取出所有的service的名字,和所有car上下文的名字分別放在兩個(gè)數(shù)組里面循環(huán)這個(gè)裝有所有的service名稱的serviceNames數(shù)組,分別取出每一個(gè)servicename對(duì)應(yīng)的instance, 取出對(duì)應(yīng)主配置的ServiceInstance用getServiceInstance(serviceName, null);取出對(duì)應(yīng)car下面的service的ServiceInstance取出car下面
51、的ServiceInstance第二個(gè)參數(shù)不能為空應(yīng)該為對(duì)應(yīng)car實(shí)例的名字;取出了ServiceInstance之后需要判斷當(dāng)前ServiceInstance實(shí)例對(duì)應(yīng)的configration的EarlyInit屬性是否為true如果為true說明需要初始化,執(zhí)行 initService(ServiceInstance, true); 進(jìn)入方法以后先拿到具體的service的實(shí)例, 獲取service實(shí)例還是運(yùn)用的ServiceInstance的方法getInstance();如果service已經(jīng)初始化了 ,將不進(jìn)行初始化;執(zhí)行初始化只需要調(diào)用service的init(instance)方法;一般的service里面沒有這個(gè)方法,這樣可以直接調(diào)用GenericService的init(instance)然后回調(diào)子類的init();這種調(diào)用模式可以利用GenericService的在每一個(gè)ServiceInstance里面有一個(gè)Service instance,如果service已經(jīng)實(shí)例化了之后直接可以取出來不用再次實(shí)例化service;所有需要初始化的service初始化完
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 書店閱讀活動(dòng)對(duì)兒童認(rèn)知發(fā)展的影響研究考核試卷
- 體育產(chǎn)業(yè)市場(chǎng)營(yíng)銷環(huán)境分析考核試卷
- 軟件敏捷開發(fā)規(guī)范考核試卷
- 金屬加工機(jī)械制造行業(yè)發(fā)展趨勢(shì)考核試卷
- 跨文化背景下的金融AI產(chǎn)品推廣策略考核試卷
- 印刷工藝水墨平衡控制考核試卷
- 計(jì)劃生育證明承諾書
- 企業(yè)年終工作總結(jié)12篇
- 化工公司風(fēng)險(xiǎn)分級(jí)管控與隱患排查治理體系建設(shè)實(shí)施方案
- 正道新風(fēng)活動(dòng)方案
- 員工不能勝任工作解除勞動(dòng)合同范本
- 農(nóng)村院子轉(zhuǎn)讓合同范本
- 中小學(xué)學(xué)校內(nèi)部控制手冊(cè)
- 乳腺結(jié)節(jié)疾病的專業(yè)知識(shí)課件
- 2025年國(guó)元農(nóng)業(yè)保險(xiǎn)股份有限公司招聘筆試參考題庫含答案解析
- 中煤平朔2025筆試題庫
- 中秋國(guó)慶慰問品采購組織機(jī)構(gòu)與人員配備
- 2025年高一下學(xué)期班主任工作計(jì)劃(5篇)
- 常用消毒劑的使用方法課件
- 污水管線搶修應(yīng)急方案
- 路口道路執(zhí)勤保安服務(wù)方案
評(píng)論
0/150
提交評(píng)論