smartFramework 源碼分享綱要

一、框架伴隨tomcat 啓動初始化前端

  • ContainerListener 容器監聽器
    • // 初始化相關 Helper 類 HelperLoader.init();
    • // 添加 Servlet 映射 addServletMapping(servletContext);
    • // 註冊 WebPlugin(全部插件) registerWebPlugin(servletContext);

二、HelperLoader.init();web

  • true 傳的很關鍵,類加載而且初始化

  • 也就是,下述類的靜態代碼塊會被執行

  • DatabaseHelper
    • 封裝數據庫相關操做
    • ThreadLocal 模式 每一個線程都有單獨的連接(能夠改爲線程池)
    • @Service(類註解)、@Transaction(方法註解)
      • 使用動態代理處理 @Transaction 註解的方法
      • 基於 Apache Commons DbUtils 實現
  • EntityHelper
    • 以下圖entityClassTableNameMap、entityClassFieldMapMap 保存@Entity 註解類和數據庫表之間關係
    • 三個註解@Table、@Column、@Entity
      • 默認駝峯與下劃線互轉
      • 若是標註@Table、@Column,不轉直接取值
        • 用於不知足駝峯與下劃線互轉的狀況,特殊處理

  • ActionHelper:Action Map(HTTP 請求與 Action 方法的映射)
    • @Action類註解、@Request.Get、@Request.Post、@Request.Delete、@Request.Put 方法註解
    • 映射存入Map<Requestor, Handler> actionMap中
    • 前端控制器:DispatcherServlet
      • mvc 核心分發器
        • // 獲取 Handler(封裝 Action 方法相關信息)
          Handler handler = handlerMapping.getHandler(currentRequestMethod, currentRequestPath);
        • // 調用 Handler
          handlerInvoker.invokeHandler(request, response, handler);
          • 視圖解析器ViewResolver執行方法resolveView 完成跳轉
        • // 處理 Action 異常
          handlerExceptionResolver.resolveHandlerException(request, response, e);
    • 封裝文件上傳相關操做:UploadHelper
      • 在DispatcherServlet 初始化時進行初始化
      • 上傳也是一次servlet 請求,service裏面進行處理
  • BeanHelper(初始化相關 Bean 類)
    • @Bean、@Service、@Action、@Aspect
    • 上述註解的就是須要建立實例的Bean,存入Map<Class<?>, Object> beanMap
  • IocHelper(初始化ioc 容器)
    • 處理帶@Inject 註解的成員變量,去尋找依賴的bean對象
    • 若是有多個,@Impl可用來指定某一個,不指定默認取第一個
  • AopHelper(aop 編程)
addPluginProxy(proxyMap);      // 插件代理
addAspectProxy(proxyMap);      // 切面代理
addTransactionProxy(proxyMap); // 事務代理
  • 插件註解舉例

  • // 建立 Proxy Map(用於 存放代理類 與 目標類列表 的映射關係)
    Map<Class<?>, List<Class<?>>> proxyMap = createProxyMap();
    // 建立 Target Map(用於 存放目標類 與 代理類列表 的映射關係)
    Map<Class<?>, List<Proxy>> targetMap = createTargetMap(proxyMap);

  • PluginHelper插件擴展須要注意哪些點  
    • 繼承自PluginProxy 抽象類
      • 實現getTargetClassList 方法和doProxy 方法
    • 繼承自Plugin 接口(WebPlugin 接口 web插件,多實現一個servlet註冊方法)
      • WebPlugin 多了一個register 方法
    • 包名統一爲:com.smart4j.plugin.xxx,其中 xxx 表示 Plugin 的名稱。
    • Maven 的 Group ID 爲 com.smart4j.plugin,而且 Artifact ID 爲 smart-xxx。
    • 依賴於 smart-framework,即 Smart 框架。
  • 以cache 註解爲例:
    • CacheProxy 繼承自PluginProxy 
      • 動態代理被@Cachable註解的類,分兩種狀況對被 @CachePut、@CacheClear 註解的方法、鏈式處理數據流
    • CachePlugin 實現了Plugin 接口
      • 在init() 方法中啓動線程,每隔5秒清理下過時的緩存

用到的設計模式:數據庫

  • 工廠方法
  • 動態代理(cglib)
  • 責任鏈
  • 模板方法
  • 建造者
  • ThreadLocal 模式
  • 單例
  • 委派
相關文章
相關標籤/搜索