手寫Spring基本體系IOC+AOP+MVC+事物管理等簡單實現。

注:因爲本工程包含的內容較多。大部分設計圖、代碼示例不能提供。node

請移步至碼雲clone查看:https://gitee.com/Coodyer/Coody-Frameworkgit

本文僅介紹實現思路。web

 

By:Coody   644556636@qq.comspring

===========================json

經過分析Spring表現層。主要包括IOC、AOP兩大核心,經常使用包括MVC、事物管理等。session

 

IOC:依賴注入。架構

AOP:基於IOC實現的泛持久化動態代理。mvc

MVC:在IOC基礎上,基於Servlet實現的拓展性mapping映射。app

事務管理:基於AOP並接管數據源實現的事物控制。框架

==================================================

IOC大體思路以下:

一、創建本身的建立Bean的註解和輸出Bean的註解。分別用於Bean頭部初始化Bean、字段標識獲取Bean。創建本身的初始化接口。用於實現Bean被加載完後執行init方法。

二、用包掃描器掃描監管範圍內全部的class、並經過反射掃描全部類是否包含建立Bean的註解進行初始化操做並存儲至Bean容器

三、從Bean容器得到全部Bean、並經過反射掃描全部Bean的全部字段是否包含的輸出Bean的註解進行賦值操做

四、從Bean容器得到全部Bean、判斷是否實現初始化接口並執行init方法。

 

AOP大體思路以下:

一、建立本身的Around註解,註解參數爲Class。建立Aop方法存儲容器。本處僅實現環繞通知。

二、在IOC建立Bean以前,優先掃描包下全部類的全部方法,把包含Around註解方法存儲至容器。

三、在IOC掃描Bean的時候,檢索Bean內部是否包含註解其類型爲Around註明的Class。並選擇性進行IOC是否須要代理

四、在須要代理的場景下進行切面的調用整合。執行先後進行控制。

 

MVC大體實現思路以下:

一、建立MVC地址映射相關注解、建立Json輸出註解

二、整改IOC,在進行輸出Bean以後進行mvc註解掃描。將映射地址和方法存儲至mapping容器

三、建立Listen並實現ServletContextListener

四、覆蓋contextInitialized方法。接受參數並投遞給如上實現的IOC+AOP入口進行加載

五、新建分發器:DispatServlet,在該servlet經過mapping容器獲取到Bean、方法

六、新建參數適配器,經過第5步獲取到的方法。基於反射技術裝載參數並調用執行。

七、執行完成後獲得的結果。經過Json輸出或轉向到模板地址

 

如圖:

Image text

 

事物管理的實現:

一、新建事物管理註解

二、基於如上功能,新建切面,攔截事物管理註解

三、在切面內部。利用線程容器進行控制,是否須要事物。則寫入標識

四、在ORM層,優先從線程容器得到鏈接,沒有則建立,並與數據源綁定存儲至線程容器。

五、在切面處調用完實際方法後,則關閉線程容器中的鏈接。

 

本處獻上整合事物管理全過程的錄像:

連接: https://pan.baidu.com/s/1eTgMSUm 密碼: jxb7

=====================================================

 

源碼地址:https://gitee.com/Coodyer/Coody-Framework

源代碼說明:

=================================

更新記錄:

2018-02-24:初步研發,實現IOC+AOP

2018-02-25:拓展MVC,基於MVC結合ICO+AOP實現輕量化無依賴類spring開發模式

2018-02-26:整改成maven模式,並整合自寫ORM框架配合aop實現事物管理。

=======================================================

  1. 項目背景:

因爲筆者近期參與的一些項目體系未使用到任何框架,而筆者對spring體系特別嚮往,故此研發本項目。

  1. 功能說明:

本項目實現註解形式的bean加載、依賴注入、切面等功能。簡單實現mvc。

  1. 項目特色:

本項目使用cglib。秉承輕量、易用、簡單、高效等原則。依賴jar:cglib-nodep-3.1.jar fastjson-1.2.31.jar log4j-1.2.17.jar 依賴jar包其他版本自行測試。

  1. 環境說明:

JDK1.8+

5.目錄結構:

Image text

  1. 程序架構:

因爲在撰寫本文背景下無做圖環境,故此略去架構圖。如下提供一些結構說明

(1)、包說明

org.coody.framework.entity經常使用實體包。

org.coody.framework.util 經常使用工具包

org.coody.framework.box 核心實現包

org.coody.framework.box.adapt 適配器包

org.coody.framework.box.annotation 註解包

org.coody.framework.box.container 容器包

org.coody.framework.box.constant 常量包

org.coody.framework.box.iface 接口包

org.coody.framework.box.init 初始化入口包

org.coody.framework.box.mvc MVC實現包

org.coody.framework.box.proyx 動態代理包

org.coody.framework.box.wrapper 包裝類

(2)、類說明-註解

org.coody.framework.box.annotation.Around環繞通知註解標識,用於切面實現

org.coody.framework.box.annotation.InitBean初始化Bean。相似於spring的Service等註解,標記一個bean類

org.coody.framework.box.annotation.JsonSerialize序列化JSON輸出,用於controller方法標識。相似於spring的ResponseBody註解

org.coody.framework.box.annotation.OutBean 輸出Bean。相似於Resource/AutoWired註解

org.coody.framework.box.annotation.PathBinding 輸出Bean。相似於Resource/AutoWired注

(3)、類說明-適配器

org.coody.framework.box.adapt.ParamsAdapt 參數適配器,用於MVC下參數的裝載(目前只實現request、response、session三個參數的自動裝載)

(4)、類說明-容器

org.coody.framework.box.container.BeanContainer 容器,用於存儲bean,相似於spring的application

org.coody.framework.box.container.MappingContainer Mvc映射地址容器

(5)、類說明-接口

org.coody.framework.box.iface.InitFace 初始化接口,凡是實現該接口的bean需實現init方法。在容器啓動完成後執行。

(6)、類說明-啓動器

org.coody.framework.box.init.BoxRute 容器入口。經過該類的init(packet)方法指定掃描包路徑

org.coody.framework.box.init.BoxServletListen 監聽器,配置在webxml用於引導容器初始化

(7)、類說明-mvc分發器

org.coody.framework.box.mvc.DispatServlet 相似於spring的DispatServlet

(8)、類說明-代理工具

org.coody.framework.box.proyx.CglibProxy 基於cglib字節碼建立子類的實現

(9)、類說明-包裝類

org.coody.framework.box.wrapper.AspectWrapper 本處命名可能不盡規範。本類用於多切面的調度和適配

7.使用說明: (1)、web.xml說明

<!-- 配置掃描的包 -->
	<context-param>
		<param-name>scanPacket</param-name>
		<param-value>org.coody.web</param-value>
	</context-param>
	<!-- 配置監聽器 -->
	<listener>
		<listener-class>org.coody.framework.box.init.BoxServletListen</listener-class>
	</listener>
	<!-- 初始化分發器 -->
	<servlet>
		<servlet-name>DispatServlet</servlet-name>
		<servlet-class>org.coody.framework.box.mvc.DispatServlet</servlet-class>
	</servlet>
	<!-- MVC配置 -->
	<servlet-mapping>
		<servlet-name>DispatServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

(2)、MVC使用說明

no.一、在scanPacket指定的包目錄下某個類使用@PathBinding("/test")註解。傳入參數即該類映射路徑

no.二、在方法上面指定@PathBinding("/index.do")註解,傳入參數即方法映射路徑

no.三、該方法的訪問路徑爲 /test/index.do

no.四、映射方法拓展註解@JsonSerialize 被該註解標識的方法將輸出json

no.五、示例:

 

(3)、IOC使用說明

no.一、在須要初始化爲bean的類上指定@InitBean註解

no.二、在須要IOC賦值的字段上指定@OutBean

no.三、示例

 

經過以上註解,完成整個IOC依賴注入的全過程。

(4)、切面使用說明

no.一、自定義一個註解

no.二、在須要攔截的方法上面標識該註解

no.三、編寫一個類,經過@InitBean修飾以實例化bean。在bean內部編寫方法。方法用@Around註解修飾。@Around註解傳入值爲第一步的自定義註解。方法參數類型爲AspectWrapper

no.四、在如上操做完成後,凡是包含該自定義註解的方法均經過環繞通知

no.五、示例:

 

  1. 實現效果: 

 

  1. Image text

Image text

  1. 版權說明:

在本項目源代碼中,已有測試demo,包括mvc、切面等示例

做者:Coody

反饋郵箱:644556636@qq.com

相關文章
相關標籤/搜索