注:因爲本工程包含的內容較多。大部分設計圖、代碼示例不能提供。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輸出或轉向到模板地址
如圖:
事物管理的實現:
一、新建事物管理註解
二、基於如上功能,新建切面,攔截事物管理註解
三、在切面內部。利用線程容器進行控制,是否須要事物。則寫入標識
四、在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實現事物管理。
=======================================================
因爲筆者近期參與的一些項目體系未使用到任何框架,而筆者對spring體系特別嚮往,故此研發本項目。
本項目實現註解形式的bean加載、依賴注入、切面等功能。簡單實現mvc。
本項目使用cglib。秉承輕量、易用、簡單、高效等原則。依賴jar:cglib-nodep-3.1.jar fastjson-1.2.31.jar log4j-1.2.17.jar 依賴jar包其他版本自行測試。
JDK1.8+
5.目錄結構:
因爲在撰寫本文背景下無做圖環境,故此略去架構圖。如下提供一些結構說明
(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.五、示例:
在本項目源代碼中,已有測試demo,包括mvc、切面等示例
做者:Coody
反饋郵箱:644556636@qq.com