精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Play源代碼分析:Server啟動過程

開發 后端
Play!是一個full-stack(全棧的)Java Web應用框架,包括一個簡單的無狀態MVC模型,具有Hibernate的對象持續,一個基于Groovy的模板引擎,以及建立一個現代Web應用所需的所有東西。

Play是個Rails風格的Java Web框架,需要了解背景請看:

  1. Play Framework介紹1--主要概念
  2. Play Framework介紹2—Helloworld

如何調試請看此處。以下進入正題^_^

Server啟動過程主要涉及三個地方:

  1. play.Play類:代表Play本身業務模型。
  2. play.server.Server類:負責服務器啟動。
  3. play.classloading包:負責.java文件讀取、編譯和加載。

總體流程:

Play代碼分析-Server.Main

Server.main為入口方法:

  1. public static void main(String[] args) throws Exception {  
  2.         …  
  3.         Play.init(root, System.getProperty("play.id"""));  
  4.         if (System.getProperty("precompile") == null) {  
  5.             new Server();  
  6.         } else {  
  7.             Logger.info("Done.");  
  8.         }  
  9.     } 

做兩件事:

  1. Play.init
  2. 然后創建Server對象。

Play.init

  1. public static void init(File root, String id) {  
  2.  
  3. …  
  4.  
  5. readConfiguration();  
  6.  
  7.          Play.classes = new ApplicationClasses();  
  8.  
  9.         …  
  10.  
  11.         // Build basic java source path  
  12.         VirtualFile appRoot = VirtualFile.open(applicationPath);  
  13.         roots.add(appRoot);  
  14.         javaPath = new ArrayList<VirtualFile>(2);  
  15.         javaPath.add(appRoot.child("app"));  
  16.         javaPath.add(appRoot.child("conf"));  
  17.  
  18.         // Build basic templates path  
  19.         templatesPath = new ArrayList<VirtualFile>(2);  
  20.         templatesPath.add(appRoot.child("app/views"));  
  21.  
  22.         // Main route file  
  23.         routes = appRoot.child("conf/routes");  
  24.  
  25.         …  
  26.  
  27.         // Load modules  
  28.         loadModules();  
  29.  
  30.         …  
  31.  
  32.         // Enable a first classloader  
  33.         classloader = new ApplicationClassloader();  
  34.  
  35.         // Plugins  
  36.         loadPlugins();  
  37.  
  38.         // Done !  
  39.         if (mode == Mode.PROD ||preCompile() ) {  
  40.                 start();  
  41.             }  
  42.  
  43.         …  
  44.     } 

主要做:

  1. 加載配置
  2. new ApplicationClasses();加載app、views和conf路徑到VirtualFile中,VirtualFile是Play內部的統一文件訪問接口,方便后續讀取文件
  3. 加載route
  4. 加載Module,Play的應用擴展組件。
  5. 加載Plugin,Play框架自身的擴展組件。
  6. 工作在產品模式則啟動Play.

關鍵步驟為new ApplicationClasses(),執行computeCodeHashe(),后者觸發目錄掃描,搜索.java文件。相關過程簡化代碼如下:

  1. public ApplicationClassloader() {  
  2.         super(ApplicationClassloader.class.getClassLoader());  
  3.         // Clean the existing classes  
  4.         for (ApplicationClass applicationClass : Play.classes.all()) {  
  5.             applicationClass.uncompile();  
  6.         }  
  7.         pathHash = computePathHash();  
  8.        …  
  9.     } 
  1. int computePathHash() {  
  2.         StringBuffer buf = new StringBuffer();  
  3.         for (VirtualFile virtualFile : Play.javaPath) {  
  4.             scan(buf, virtualFile);  
  5.         }  
  6.         return buf.toString().hashCode();  
  7.     } 
  1. void scan(StringBuffer buf, VirtualFile current) {  
  2.         if (!current.isDirectory()) {  
  3.             if (current.getName().endsWith(".java")) {  
  4.                 Matcher matcher = Pattern.compile("\\s+class\\s([a-zA-Z0-9_]+)\\s+").matcher(current.contentAsString());  
  5.                 buf.append(current.getName());  
  6.                 buf.append("(");  
  7.                 while (matcher.find()) {  
  8.                     buf.append(matcher.group(1));  
  9.                     buf.append(",");  
  10.                 }  
  11.                 buf.append(")");  
  12.             }  
  13.         } else if (!current.getName().startsWith(".")) {  
  14.             for (VirtualFile virtualFile : current.list()) {  
  15.                 scan(buf, virtualFile);  
  16.             }  
  17.         }  
  18.     } 
Start流程

Play.Start過程

簡化代碼如下:

  1. public static synchronized void start() {  
  2.         try {  
  3.                         ...  
  4.             // Reload configuration  
  5.             readConfiguration();  
  6.  
  7.                         ...  
  8.               
  9.             // Try to load all classes  
  10.             Play.classloader.getAllClasses();  
  11.  
  12.             // Routes  
  13.             Router.detectChanges(ctxPath);  
  14.  
  15.             // Cache  
  16.             Cache.init();  
  17.  
  18.             // Plugins  
  19.             for (PlayPlugin plugin : plugins) {  
  20.                 try {  
  21.                     plugin.onApplicationStart();  
  22.                 } catch(Exception e) {  
  23.                     if(Play.mode.isProd()) {  
  24.                         Logger.error(e, "Can't start in PROD mode with errors");  
  25.                     }  
  26.                     if(e instanceof RuntimeException) {  
  27.                         throw (RuntimeException)e;  
  28.                     }  
  29.                     throw new UnexpectedException(e);  
  30.                 }  
  31.             }  
  32.  
  33.             ...  
  34.  
  35.             // Plugins  
  36.             for (PlayPlugin plugin : plugins) {  
  37.                 plugin.afterApplicationStart();  
  38.             }  
  39.  
  40.         } catch (PlayException e) {  
  41.             started = false;  
  42.             throw e;  
  43.         } catch (Exception e) {  
  44.             started = false;  
  45.             throw new UnexpectedException(e);  
  46.         }  
  47.     } 

關鍵步驟為執行Play.classloader.getAllClasses()加載app目錄中的類型。簡化代碼如下:

  1. public List<Class> getAllClasses() {  
  2.         if (allClasses == null) {  
  3.             allClasses = new ArrayList<Class>();  
  4.  
  5.             if (Play.usePrecompiled) {  
  6.                 ...  
  7.             } else {  
  8.                 List<ApplicationClass> all = new ArrayList<ApplicationClass>();  
  9.  
  10.                 // Let's plugins play  
  11.                 for (PlayPlugin plugin : Play.plugins) {  
  12.                     plugin.compileAll(all);  
  13.                 }  
  14.  
  15.                 for (VirtualFile virtualFile : Play.javaPath) {  
  16.                     all.addAll(getAllClasses(virtualFile));  
  17.                 }  
  18.                 List<String> classNames = new ArrayList<String>();  
  19.                 for (int i = 0; i < all.size(); i++) {  
  20.                     if (all.get(i) != null && !all.get(i).compiled) {  
  21.                         classNames.add(all.get(i).name);  
  22.                     }  
  23.                 }  
  24.  
  25.                 Play.classes.compiler.compile(classNames.toArray(new String[classNames.size()]));  
  26.  
  27.                 for (ApplicationClass applicationClass : Play.classes.all()) {  
  28.                     Class clazz = loadApplicationClass(applicationClass.name);  
  29.                     if (clazz != null) {  
  30.                         allClasses.add(clazz);  
  31.                     }  
  32.                 }  
  33.                                 ...  
  34.             }  
  35.         }  
  36.         return allClasses;  
  37.     } 

主要步驟:

  1. plugin.compileAll,給所有plugin一次機會進行自定義編譯。
  2. Play.classes.compiler.compile(classNames.toArray(new String[classNames.size()]));編譯所有.java文件。編譯后的.class存儲在ApplicationClass中。內部使用了eclipse的JDT編譯器。
  3. loadApplicationClass,取出ApplicationClass中的.class加入List<Class>中返回。

到此完成.java的加載。相關對象關系如下圖:

Play代碼分析

接著new Server()啟動HTTP服務,監聽請求

簡化代碼如下:

  1. public Server() {  
  2.              ...  
  3.         if (httpPort == -1 && httpsPort == -1) {  
  4.             httpPort = 9000;  
  5.         }  
  6.         ...  
  7.         InetAddress address = null;  
  8.         try {  
  9.             if (p.getProperty("http.address") != null) {  
  10.                 address = InetAddress.getByName(p.getProperty("http.address"));  
  11.             } else if (System.getProperties().containsKey("http.address")) {  
  12.                 address = InetAddress.getByName(System.getProperty("http.address"));  
  13.             }  
  14.  
  15.         } catch (Exception e) {  
  16.             Logger.error(e, "Could not understand http.address");  
  17.             System.exit(-1);  
  18.         }  
  19.           
  20.         ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(  
  21.                 Executors.newCachedThreadPool(), Executors.newCachedThreadPool())  
  22.         );  
  23.         try {  
  24.             if (httpPort != -1) {  
  25.                 bootstrap.setPipelineFactory(new HttpServerPipelineFactory());  
  26.                 bootstrap.bind(new InetSocketAddress(address, httpPort));  
  27.                 bootstrap.setOption("child.tcpNoDelay"true);  
  28.  
  29.                 if (Play.mode == Mode.DEV) {  
  30.                     if (address == null) {  
  31.                         Logger.info("Listening for HTTP on port %s (Waiting a first request to start) ...", httpPort);  
  32.                     } else {  
  33.                         Logger.info("Listening for HTTP at %2$s:%1$s (Waiting a first request to start) ...", httpPort, address);  
  34.                     }  
  35.                 } else {  
  36.                     if (address == null) {  
  37.                         Logger.info("Listening for HTTP on port %s ...", httpPort);  
  38.                     } else {  
  39.                         Logger.info("Listening for HTTP at %2$s:%1$s  ...", httpPort, address);  
  40.                     }  
  41.                 }  
  42.  
  43.             }  
  44.  
  45.         } catch (ChannelException e) {  
  46.             Logger.error("Could not bind on port " + httpPort, e);  
  47.             System.exit(-1);  
  48.         }  
  49.         ...  
  50.     } 

主要步驟:

  1. 設置端口,地址
  2. new ServerBootstrap,創建jboss netty服務器。Play1.1.1使用了netty作為底層通訊服務器。
  3. new HttpServerPipelineFactory(),設置netty所需的請求處理管道工廠。它負責當請求到達時提供處理者。
  4. bootstrap.bind(new InetSocketAddress(address, httpPort),綁定地址,端口。

到此萬事具備,只等東風了…

原文鏈接:http://www.cnblogs.com/Chaos/archive/2011/04/17/2018500.html

【編輯推薦】

  1. Play Framework介紹:使用Eclipse開發和調試
  2. Play Framework介紹:Hello World
  3. Play Framework介紹:主要概念
  4. Java堆內存的10個要點
  5. “Java已死”簡史
責任編輯:林師授 來源: Chaos的博客
相關推薦

2014-06-19 14:59:40

Android應用程序進程啟動

2014-06-20 11:20:37

Android應用程序進程啟動

2014-06-19 14:30:28

Android應用程序進程啟動

2014-06-19 14:54:11

Android應用程序進程啟動

2014-06-20 11:05:56

Android應用程序進程啟動

2014-06-20 11:24:34

Android應用程序進程啟動

2014-06-19 14:25:04

Android應用程序進程啟動

2014-06-20 11:09:35

Android應用程序進程啟動

2011-06-28 13:27:13

ARM Linux

2012-08-16 09:07:57

Erlang

2018-03-13 13:00:03

Linux運維啟動分析

2024-09-11 09:25:03

Tomcat組件PREP

2014-06-23 10:31:09

Android啟動過程

2011-07-28 10:34:38

Cocoa 程序 啟動

2011-09-05 17:35:18

MTK啟動過程RTOS

2009-12-03 10:00:46

Linux系統啟動

2010-09-17 13:32:22

JVM.dll

2021-07-02 06:34:53

Go語言sysmon

2010-05-06 14:05:15

Unix系統

2009-07-08 11:25:36

jvm.dll
點贊
收藏

51CTO技術棧公眾號

国产suv一区二区三区88区| 欧美涩涩视频| 欧美一级高清片| 日韩中文字幕在线视频观看| 精品美女视频在线观看免费软件 | 久久免费精品国产久精品久久久久| 日本亚洲欧美成人| 欧美肥妇bbwbbw| 欧美精品中文| 欧美精品久久久久久久多人混战 | 天堂在线一区二区| 久久亚洲影音av资源网| 三叶草欧洲码在线| 国产日韩一区二区三免费高清| 午夜影院在线观看欧美| 性刺激综合网| 少妇无码一区二区三区| 另类的小说在线视频另类成人小视频在线| 欧美另类交人妖| 人人妻人人澡人人爽| 超碰精品在线| 欧美日韩国产美| 青青草原成人网| 伦理在线一区| 日韩理论在线观看| 欧美综合激情| 污污视频在线观看网站| 国产在线精品一区二区三区不卡 | 国产一级黄色录像片| 国产主播福利在线| www.成人在线| 国产二区不卡| 国产内射老熟女aaaa∵| 蜜桃一区二区三区在线观看| 欧美在线观看视频| 国产香蕉在线视频| 欧美片第1页综合| 精品精品国产国产自在线| 自拍偷拍亚洲天堂| 久久97精品| 欧美成人一区二区三区在线观看| 手机av在线网| 欧美久久久网站| 欧美视频一区二区在线观看| 日本999视频| 中文字幕资源网在线观看免费 | 91免费视频观看| 国产精品jizz视频| 亚洲av无码乱码国产精品| 国产专区综合网| 国产一区私人高清影院| 在线观看毛片视频| 免费人成在线不卡| 青草青草久热精品视频在线观看| av资源吧首页| 亚洲美女黄色| 97视频免费在线看| 国产69精品久久久久久久久久| 亚洲人成毛片在线播放女女| 久久久噜噜噜久久中文字免| 日韩精品一区二区av| 亚洲欧洲视频| 青青久久av北条麻妃黑人| 日日夜夜综合网| 免费日韩精品中文字幕视频在线| 欧美一性一乱一交一视频| 久久99国产综合精品免费| 老司机午夜精品视频在线观看| 国产精品h在线观看| 麻豆精品久久久久久久99蜜桃| 欧美在线综合| 国产精品亚洲аv天堂网| 97超碰国产在线| 国产麻豆精品95视频| 97se在线视频| 亚洲 另类 春色 国产| 国产日韩精品久久久| 在线观看成人一级片| 影音先锋在线播放| 天天影视网天天综合色在线播放| 成人在线看视频| 亚洲青青久久| 亚洲高清久久久久久| 美女脱光内衣内裤| 91青青国产在线观看精品| 欧美成人激情图片网| 国产精品第九页| 日韩福利视频网| 91香蕉嫩草影院入口| 天天射天天色天天干| 国产精品二区一区二区aⅴ污介绍| av中文字幕av| 欧美xxxxxx| 宅男在线国产精品| 你懂得在线视频| 欧美亚洲高清| 久久久久久久一区二区三区| 免费无码国产精品| 国产精品一二三四| 欧美一区免费视频| 污污片在线免费视频| 日本国产一区二区| 日本少妇一区二区三区| 中文精品一区二区| 久久999免费视频| 午夜精品免费观看| 成人一区二区三区在线观看| 日韩av在线电影观看| 国产丝袜在线观看视频| 欧美亚洲国产一区在线观看网站| 国产sm在线观看| 日韩伦理一区| 欧美性受xxx| 国产后入清纯学生妹| 国产欧美一区二区精品忘忧草| 91传媒免费视频| 亚洲综合av一区二区三区| 精品对白一区国产伦| 四虎地址8848| 日韩成人精品在线观看| 国产日韩精品一区观看| 黄色精品免费看| 在线精品视频小说1| 国产人妻黑人一区二区三区| 亚洲不卡av不卡一区二区| 国产成人久久久精品一区| 亚洲精品字幕在线| 亚洲精品欧美在线| 午夜剧场在线免费观看| 久久成人av| 777午夜精品福利在线观看| 午夜美女福利视频| 亚洲色图.com| 在线观看免费不卡av| sdde在线播放一区二区| 日本精品性网站在线观看| 天天操天天舔天天干| 亚洲综合区在线| 日日夜夜精品视频免费观看 | 2021国产精品久久精品| 久久在线中文字幕| 亚洲一二av| 精品中文字幕在线观看| 国产精品视频一二区| 中文字幕在线不卡| 不用播放器的免费av| 久久一区二区三区电影| 国产精品日韩欧美大师| lutube成人福利在线观看| 色伊人久久综合中文字幕| 亚洲激情视频小说| 日韩中文字幕区一区有砖一区| 欧美日韩国产高清视频| 国产日韩另类视频一区| 亚洲天堂网站在线观看视频| 国产无遮挡又黄又爽又色视频| 国产亚洲一区二区三区| 男女啪啪网站视频| 欧美一区二区三区高清视频| 国产精品免费一区| 婷婷免费在线视频| 91精品欧美福利在线观看| 校园春色 亚洲| 成人av资源在线| 国产黄色一级网站| 精品产国自在拍| 国产精品亚洲精品| 成人黄色在线电影| 精品国产91久久久久久久妲己| 日本黄色片视频| 久久嫩草精品久久久精品一| 黄色在线视频网| 888久久久| 国产精品三区www17con| 芒果视频成人app| 色妞一区二区三区| www.亚洲欧美| 欧美日韩加勒比精品一区| 成人黄色免费网址| 国产福利一区二区三区视频在线 | 亚洲精品高清国产一线久久| 白嫩亚洲一区二区三区| 97在线免费观看| 香蕉视频免费在线播放| 精品国产一区二区三区av性色| 天天干在线播放| 综合激情成人伊人| 国产毛片毛片毛片毛片毛片毛片| 日韩精品视频网| 香港三级日本三级a视频| 精品在线观看入口| 成人自拍性视频| 伊伊综合在线| 久久国产精品久久精品| 欧美日本网站| 日韩精品影音先锋| 中文无码av一区二区三区| 亚洲精品视频免费看| 亚洲调教欧美在线| 黄色小说综合网站| 欧美精品成人网| 亚洲第一在线| 亚洲免费av网| 精品国产一区二区三区久久久樱花 | 天堂社区 天堂综合网 天堂资源最新版| 日本免费精品| 国产精品视频在线观看| 19禁羞羞电影院在线观看| 久久精品青青大伊人av| 黄色软件在线| 亚洲国产三级网| 99视频免费看| 欧美色偷偷大香| 免费的毛片视频| 亚洲国产精品影院| 亚洲精品久久久久久国| 国产亚洲欧美激情| av黄色一级片| 国产大片一区二区| 在线免费看v片| 日本欧美韩国一区三区| 日韩av三级在线| 影音先锋中文字幕一区| 欧美性受xxxx黑人猛交88| 精品亚洲成人| 欧美日韩综合网| 香蕉久久精品| 国内视频一区二区| 91久久精品无嫩草影院| 成人福利网站在线观看| 欧美xnxx| 国产a级全部精品| 中文字幕在线视频久| 88xx成人精品| 免费看男女www网站入口在线| 欧美激情免费看| 日韩伦理电影网站| 欧美日韩国产成人| 中文字幕在线播放网址| 欧美大胆在线视频| 18+视频在线观看| 美女啪啪无遮挡免费久久网站| 视频免费一区| 久久久国产视频| av电影高清在线观看| 九九热精品视频| 美女精品导航| 97热在线精品视频在线观看| 欧美私密网站| 日本国产一区二区三区| 成人天堂yy6080亚洲高清| 国产精品91一区| 国产福利亚洲| 成人深夜直播免费观看| 精品国产三区在线| 成人自拍网站| 狠狠一区二区三区| 久久天天狠狠| 成人影院在线| 警花观音坐莲激情销魂小说| 欧美精品aa| 蜜臀av无码一区二区三区| 亚洲一区二区成人| 日本va中文字幕| 精品亚洲免费视频| 亚洲妇女无套内射精| 99久久精品免费观看| 一级片视频免费看| 国产精品三级视频| 五月婷婷一区二区| 午夜精品久久久久久| 欧美日韩一级黄色片| 欧美日韩成人一区| 亚洲xxxx天美| 亚洲欧美一区二区三区情侣bbw| 国产福利免费在线观看| 久久综合88中文色鬼| 99久久精品免费看国产小宝寻花| 欧美一性一乱一交一视频| 日韩毛片免费视频一级特黄| 高清不卡一区二区三区| 综合亚洲色图| 波多野结衣激情| 国产精品一卡| 国产永久免费网站| 99久久夜色精品国产网站| 久久久免费看片| 亚洲国产日日夜夜| 中文字幕精品无码亚| 精品国产电影一区二区| 黄色片视频在线观看| 欧美精品一区三区| 韩国美女久久| eeuss一区二区三区| 精品久久久久久久久久久下田 | 来吧亚洲综合网| 午夜视频一区二区三区| 伊人网视频在线| 精品福利一二区| 欧美精品日韩少妇| 97久久精品人搡人人玩| 国产精品777777在线播放| 麻豆精品蜜桃一区二区三区| 91精品久久久久久久蜜月| 无码精品国产一区二区三区免费| 国产一区二区视频在线| 日本性高潮视频| 午夜私人影院久久久久| 国产三级按摩推拿按摩| 亚洲日韩欧美视频一区| av人人综合网| 亚洲一区二区免费| 第一社区sis001原创亚洲| 国产成人精品视频免费看| 国产精品99久久久久久似苏梦涵 | 中文字幕在线免费看线人| 亚洲精品欧美激情| 国产精品久久久久久69| 国产一区二区动漫| 亚洲精品一区| 精品国产二区在线| 欧美日韩一视频区二区| 91久久久久久久久久久| 欧美黑人性猛交xxx| 国产成人综合网站| 免费成人深夜天涯网站| 欧美视频免费在线| 乱精品一区字幕二区| 欧美另类在线播放| 99视频这里有精品| 一区二区不卡在线视频 午夜欧美不卡'| 久久国产精品毛片| 亚洲中文字幕无码av| 午夜久久久久久久久久一区二区| 精品国产免费无码久久久| 久久精品国亚洲| 亚洲精品69| 国产精品美女在线播放| 久久国产日韩欧美精品| 国产精品一区二区亚洲| 欧美亚洲尤物久久| yourporn在线观看视频| 国产精品久久久久福利| 欧美天天综合| 日韩av片网站| 国产精品美女久久久久久久久久久 | 北岛玲一区二区| 欧美日韩一区二区三区在线免费观看| 日本高清视频网站| 97成人精品区在线播放| 欧美三级电影在线| 亚洲乱码中文字幕久久孕妇黑人| 26uuu精品一区二区在线观看| 制服.丝袜.亚洲.中文.综合懂色| 亚洲精品国产福利| 欧美日韩国产v| 日韩av高清在线播放| 蜜桃av一区二区在线观看| 日韩一卡二卡在线观看| 欧美一区二区久久| 久草在线资源站资源站| 精品国产二区在线| 日韩不卡一区二区| 日本一二三区在线观看| 欧美va亚洲va在线观看蝴蝶网| 超碰在线中文字幕| 欧美大香线蕉线伊人久久国产精品| 日韩二区在线观看| 亚洲一级二级片| 欧美精品一区二区三区蜜桃| a√中文在线观看| 日韩av电影免费观看| 国产最新精品免费| 黄色激情视频在线观看| 一区二区欧美日韩视频| 96视频在线观看欧美| 欧美成人三级在线视频| 国产午夜精品美女毛片视频| 91精品在线视频观看| 欧美激情精品久久久久久免费印度 | 国产成人精品免费| 国产网址在线观看| 国产亚洲欧美日韩美女| 精品入口麻豆88视频| 免费成人午夜视频| 国产精品国产三级国产aⅴ原创| 亚洲国产一二三区| 日产精品99久久久久久| 一区二区电影| 波多野结衣 在线| 91精品在线一区二区| 性xxxxfreexxxxx欧美丶| 老司机av福利| 2021国产精品久久精品| 国产三级伦理片| 国产精品久久久999| 国内一区二区三区| 国产aaaaaaaaa| 亚洲国产精品yw在线观看| 日韩av懂色|