1. 程式人生 > >Web框架實戰

Web框架實戰

架構探險——從零開始寫Java Web框架

需求來源

web框架全盤掌控

實踐程式碼地址:

業務模組

解決問題

控制層、業務層、持久層分層,利於模組解耦和複用。

使用方法

引入DHMap的jar包,控制層繼承BasicController,業務層繼承BasicServiceImpl,且都通過註解宣告為spring元件,檢視Bean繼承VO,持久Bean繼承PO,持久Bean上通過@Table對應資料庫表名,域上@Column對應欄位,@ID對應id,還可用@OneToOne,@OneToMany等實現表關聯關係。

實現原理:

  • 泛型控制層類,實現符合REST的CRUD方法,用於被繼承使用
  • 泛型業務層類,實現了CRUD方法,將VO轉化為PO ,用於被繼承使用
  • 提供SQL的CRUD模板,只需拼入表的名、欄位、值等資訊
  • 泛型持久層類,實現了CRUD方法,分析PO的註解,提取表資訊
  • 將表資訊拼入SQL模板,形成SQL語句,呼叫mybatis實現結果返回
  • 對返回結果解析,並反射例項化PO以及PO的域賦值

程式碼分析:

  • 定義一系列註解
    對帶Blob,Clob註解等域需cast (XXX as CHAR) as XXX取出,Ignore表示該域不對應庫欄位
  • BasicController.java為控制層基類
    提供了CRUD以及分頁查詢等方法,返回結果格式統一為Result
  • BasicServiceImpl.java為業務層基類
    • 介面方法實現於BasicService,提供了基本和批量的CRUD方法
    • 初始化方法內通過反射獲取類的泛型型別
    • 單例化BasicMapperImpl時傳過去
    • 接受來自Controller的VO,反射建立PO並賦值,呼叫BasicMapperImpl方法
  • BasicMapperImpl.java為持久層封裝類
    • 介面方法實現於BasicMapper,提供了基本和批量的CRUD方法,其中selectList用於欄位匹配查詢,接受Condition引數,可定義分頁引數和基於WhereOperator比較符的where子句拼接
    • 根據PO資訊分析,轉為對應sql語句
    • 呼叫到SQL模板拼接中
    • 呼叫mybatis實現結果返回
    • 根據PO資訊分析,反射到PO中,返回
  • SqlMapper.java為SQL模板
    之前使用BasicMapper.xml實現模板,但後續mybatis更新版本,可以通過@Insert等註解在介面使用
  • Entity.java為PO資訊分析類
    • 獲取PO所有域,分析@[email protected]@[email protected]等註解,對域重封裝
    • 記錄域名和域對應庫欄位名
    • 根據是否有@OneToOne,@OneToMany等註解的域,延伸到下一個PO,遞迴記錄關聯關係
    • 記錄每個PO的父PO,並取別名備用
  • SqlUtil.java將PO資訊轉化為sql語句和將jdbc返回結果轉為PO
    其中getJoinPart方法將表關係轉為ONE_A a left join ONE_B b on a.id=b.a_id等
    handleResult方法將map轉為list

IOC

概念

依賴注入,也叫控制反轉,通過遮蔽介面的實現方法,實現物件的不同行為。

解決問題

專案越大,物件的例項化和相互引用關係關聯等動作佔據時間增多,spring框架的自動裝配簡化了該步驟。

使用方法

類上註解@Componet宣告為元件,類域上註解@Autowired或@Resource宣告為需注入的域。

實現原理

  • 新建類載入器,掃描指定包下所有類
  • 所有類中分析出元件類(帶有或註解於@Componet的註解,如@Controller)
  • 反射例項化元件類
  • 找出元件類中需注入的域(帶有註解@Autowired或@Resource)
  • 對需注入的域,進行反射賦值

程式碼分析

  • 定義元件註解
    Component註解關係圖為,@Controller,@Service,@Repository註解上注著@Componet,而@RestController上注著@Controller
  • ClassUtil.java實現獲取包名下所有類
    • 根據當前執行緒的類載入器,取到編譯後文件根路徑,如D:\DSS\DHMap\Trunk\target\classes
    • 將制定包名轉為檔案路徑,結合根路徑,如com.dahua,結合為D:\DSS\DHMap\Trunk\target\classes\com\dahua
    • 遞迴記錄檔案下字尾為.class的檔案
    • 若發現jar包則遍歷jar內部檔案,記錄字尾為.class的檔案
    • 將.class檔案路徑轉為類全限定名,如D:\DSS\DHMap\Trunk\target\classes\com\dahua\frame\ioc\annotatio\Component.class,轉為com.dahua.frame.ioc.annotatio.Component
    • 呼叫Class.forName載入位元組,載入並記錄該類
  • ClassHelper.java實現獲取元件類
    • 遞迴獲取@Componet的子註解
    • 遍歷所有類,判斷是否帶有@Componet或其子註解
  • BeanHelper.java實現元件例項化、
    遍歷元件類
    呼叫class的newInstance方法,呼叫類的無參構造區 //todo 可先判斷有哪些構造器,再呼叫
  • IOCHelper.java實現域相互注入
    遍歷元件類的域組,判斷是否帶有@Autowired或@Resource註解,通過類獲取工廠中例項,呼叫field的set賦值
  • ApplicationHelper.java實現以上諸類的靜態程式碼塊載入

MVC

概念

Model(模型)、View(檢視)、Controller(控制器)分離。

解決問題

對Servlet解耦,解析URL分發到對應控制層。

使用方法

web.xml新增DispatcherServlet,URL匹配為/。

實現原理

  • 獲取帶有@Controller或@RestController的類
  • 解析並快取類的每個方法對應的URL和Method
  • servlet解析URL,並封裝引數
  • servlet分發到對應方法
  • servlet對方法返回值進行分析,判斷是頁面跳轉還是資料返回

AOP

概念

解決問題

使用方法

實現原理

Transaction

概念

事物的ACID,分別為原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)。

解決問題

使用方法

實現原理

相關推薦

Web框架實戰

架構探險——從零開始寫Java Web框架 需求來源 web框架全盤掌控 序 實踐程式碼地址: 業務模組 解決問題 控制層、業務層、持久層分層,利於模組解耦和複用。 使用方法 引入DHMap的jar包,控制層繼承BasicC

【Spring 5】響應式Web框架實戰(上)

引子:被譽為“中國大資料第一人”的塗子沛先生在其成名作《資料之巔》裡提到,摩爾定律、社交媒體、資料探勘是大資料的三大成因。IBM的研究稱,整個人類文明所獲得的全部資料中,有90%是過去兩年內產生的。在此背景下,包括NoSQL,Hadoop, Spark,

Gin Web框架實戰速學 二 URL規則設置,帶參數的路由

div span 展現 路徑 輸出 我們 query 逼格 獲取 gin的路由使用的是httprouter庫(請自行github一下),性能好,相對功能夠用 傳統的一些API路徑設計方式(仔細看看行不行) GET /topic/{topic_id} 獲取帖子明細GET /t

golang實戰使用gin+新版微信公眾號賽車源碼建go語言web框架rest

gmv 結構 一是 封裝 微信 springmvc 積累 產品 越來越大 聯系方式:QQ:2747044651 網址2017年我們聯系方式:QQ:2747044651 網址公司需要快速叠代一款聯系方式:QQ:2747044651 網址產品,當聯系方式:QQ:27470446

網站搭建筆記精簡版---廖雪峰WebApp實戰-Day5:編寫Web框架筆記

網站搭建筆記精簡版-廖雪峰教程學習@[三川水祭] 僅作學習交流使用,將來的你會感謝現在拼命努力的自己!!! 本文首先對web框架進行了程式碼上的解釋,之後對編輯middleware部分進行了程式碼的分析,最後講述瞭如何測試從開始到現在所有程式碼的流程。 web框

golang實戰使用gin+xorm搭建go語言web框架restgo詳解6.4 推薦程式設計方式

6.4 高階查詢對於部分比較特殊的服務,比如根據關鍵字、建立時間等查詢獲取使用者資訊,我們需要設計便於維護的資料結構,我們建議將查詢條件封裝到一個結構體中,具體操作如下1、在model目錄下定義使用者資

golang實戰使用gin+xorm搭建go語言web框架restgo詳解2 框架基本架構

2、框架基本結構一個典型的專案框架,資料夾目錄如下,下面我們來逐一說明這些資料夾或檔案的作用.2.1 控制器資料夾controller該目錄主要儲存控制器檔案,特別地,我們做如下約定1、 檔名稱首字母一律大寫,後面必須新增Controller結尾,用做標識這是控制器檔案,如U

Go實戰--也許最快的Go語言Web框架kataras/iris初識(basic認證、Markdown、YAML、Json)

生命不止,繼續 go go go !!! 接下來,想跟大家一起分享一些golang語言成熟的、知名度比較高的web框架。 我們從iris web框架開始,開始呢,我們先不去計較和比較誰的速度快,誰的效能好,讓我們先學習如何使用,積累到了一定程度後,再去進行測

Go實戰--也許最快的Go語言Web框架kataras/iris初識三(Redis、leveldb、BoltDB)

生命不止,繼續 go go go !!! 繼續跟大家一起學習iris框架. Redis 啟動Windows上redis服務 credis-server.exe redis.windows.conf 如果出現[9376] 25 Oct

Python廖雪峰實戰web開發(Day5-編寫web框架

因為複雜的Web應用程式,光靠一個WSGI(Web Server Gateway Interface)函式來處理還是太底層了,我們需要在WSGI之上再抽象出Web框架(比如Aiohttp、Django、Flask等),從而進一步簡化Web開發。 在da

Go實戰--也許最快的Go語言Web框架kataras/iris初識四(i18n、filelogger、recaptcha)

生命不止,繼續 go go go !!! 繼續分享關於kataras/iris框架 i18n i18n(其來源是英文單詞 internationalization的首末字元i和n,18為中間的字元數)是“國際化”的簡稱。在資訊領域,國際化(i18n)指讓產

Python實戰開發之Pyramid Web框架在商城專案中的應用教程

第一講:Python基礎和入門介紹(Web開發基礎) 介紹Web開發技術和Python語言的基礎知識。通過本講的學習,學員可以瞭解Python Web開發技術的基礎和相關常識,為後續學習打下基礎。 第二講:Python語言基礎(運算子與表示式,控制流,函式,模組) 在第一講的基礎上繼續深入學習Pyth

python web框架企業實戰詳解(第六期)\第三課時-css&bootstrap

raw css:<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <

golang實戰使用gin+xorm搭建go語言web框架restgo詳解5 控制器C

無論多麼先進的框架,mvc思想都是值得借鑑的, mvc是模型(model)-檢視(view)-控制器(controller)的縮寫,他是一種軟體設計典範,他用業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,這樣做有巨大的好處,他在改進和個性化定製介

golang實戰使用gin+xorm搭建go語言web框架restgo詳解10 使用restgo搭建後臺管理系統

1、首先上效果2、如何使用2.1、使用如下指令克隆cd $GOPATH/src git clone https://github.com/winlion/restgo-admin.git 你將得到restgo-admin 目錄 進入目錄 cd restgo-admin2.2、

Python3教程Web開發實戰梳理-day5(Web框架

Day5:編寫Web框架 前面完成了資料庫的部署與操作封裝,現在開始進入到伺服器方面的工作。我們前面提到了,在本專案中我們引入了非同步框架aiohttp,並且他自身提供了一個伺服器。aiohttp已經是一個框架了,為什麼我們還要再自己實現呢? 原因在於,從框

python web框架企業實戰詳解(第六期)\第三課時-ajax&jquery&webpy

main.py__author__ = 'Liao' import web import time urls = ( '/gettime','gettime', '/(.*)', 'hello' ) app = web.application(urls,

python web框架企業實戰詳解(第六期)\第一課時-sorted&if&for

1、元組和列表的區別? 元組:用元括弧括起來的一組元素集合。其特點是內容丌可變,即一旦定義其長度和內容都是固定的;類似於C詢言的陣列。 列表:由中括弧括起來的包含一組元素的集合;其特點是長度和內容都可以改變。可以理解為java中的連結串列陣列。 2、python中分割列表用

golang實戰使用gin+xorm搭建go語言web框架restgo詳解1.2 我要做什麼

個人覺得golang 是一款非常優秀的語言,但是非常遺憾,目前還不是我們團隊的最優選擇,為了彌補這份遺憾,我們需要做些什麼。梳理一下,我要做的事情,主要有如下幾點1、演示如何整合golang web框架

Eclipse+CXF框架開發Web服務實戰

二、JDK配置 安裝JDK1.6.0,配置環境變數。 JAVA_HOME:C:\Program Files\Java\jre1.6.0_07。 Path:C:\Program Files\Java\jre1.6.0_07\bin。 CLASSPATH:C:\Progra