代码改变世界

我记录开源系统1.6源码解析(一)

2012-01-13 21:30  爱研究源码的javaer  阅读(362)  评论(0编辑  收藏  举报

我记录给我的感觉还可以,毕竟大部分是出自一人之手,能做到这样已经很不错,下面我来一步步尝试分析它是如何实现如

此强大的功能的。

首先从Global.asax开始,这是应用程序开始的地方,可以看到Application_Start这个方法。我们可以先从这个方法入手。

        wojilu.Web.SystemInfo.Init();//系统的固定数据,比如网站根路径,app路径,主机(ip+端口号)名称等。这里的信息是以后路由的参考信息,在以后Url和实际地址映射的时候将用到这里的数据


首先分析wojilu.Web.SystemInfo.Init()方法,该方法在SystemInfo这个类下,属于静态方法可以直接由类调用。

public static void Init() {

           if (_hasInitialized) return;

           lock (_objLock) {
               if (_hasInitialized) return;
               SystemInfo obj = SystemInfo.Instance;
               _hasInitialized = true;
           }
       }

简单的几行却做了很多工作,if(_hasInitialized)判断是否已经初始化,如果已经初始化就返回不执行下面的代码,lock代码片段应该是控制并发操作的,通过锁住某个对象(_objLock),_objLock对象定义如下:

private static Object _objLock = new Object();


关键在于

SystemInfo obj = SystemInfo.Instance;


此代码调用了SystemInfo的静态成员Instance

public static SystemInfo Instance = loadSystemInfo();


这里又调用了loadSystemInfo方法。主要就是loadSystemInfo这个方法了。我们把目光转移到此方法上就好。

private static SystemInfo loadSystemInfo() {

           SystemInfo obj = new SystemInfo();

           if (IsWeb) {
               obj.applicationPath = HttpContext.Current.Request.ApplicationPath;//用在映射文件绝对路径
               obj.rootPath = addEndSlash( obj.applicationPath );
               obj.host = HttpContext.Current.Request.Url.Host;
           }
           else {
               obj.applicationPath = "/";
               obj.rootPath = "/";
               obj.host = "localhost";
           }

           return obj;

       }

首先初始化SystemInfo实例,结果返回该实例,代码很简单,就给实例的属性赋值,包括:applicationPath,rootPath,hostPath,用于系统初始化。addEndSlash方

法定义如下:

private static String addEndSlash( String appPath ) {
           if (!appPath.EndsWith( "/" )) return appPath + "/";
           return appPath;
       }

很简单,就是返回以“/”结束的字符串。

wojilu.Web.SystemInfo.Init()方法就解析到这,接下来我们会解析

wojilu.Web.Mvc.MvcFilterLoader.Init();


这个重要的方法,该方法会把我们导向Web.Config中和本系统相关的很多重要的功能。