一、框架伴隨tomcat 啓動初始化前端
![](http://static.javashuo.com/static/loading.gif)
- ContainerListener 容器監聽器
- // 初始化相關 Helper 類 HelperLoader.init();
- // 添加 Servlet 映射 addServletMapping(servletContext);
- // 註冊 WebPlugin(全部插件) registerWebPlugin(servletContext);
二、HelperLoader.init();web
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
- DatabaseHelper
- 封裝數據庫相關操做
- ThreadLocal 模式 每一個線程都有單獨的連接(能夠改爲線程池)
- @Service(類註解)、@Transaction(方法註解)
- EntityHelper
- 以下圖entityClassTableNameMap、entityClassFieldMapMap 保存@Entity 註解類和數據庫表之間關係
- 三個註解@Table、@Column、@Entity
- 默認駝峯與下劃線互轉
- 若是標註@Table、@Column,不轉直接取值
![](http://static.javashuo.com/static/loading.gif)
- 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裏面進行處理
![](http://static.javashuo.com/static/loading.gif)
- BeanHelper(初始化相關 Bean 類)
- @Bean、@Service、@Action、@Aspect
- 上述註解的就是須要建立實例的Bean,存入Map<Class<?>, Object> beanMap
- IocHelper(初始化ioc 容器)
- 處理帶@Inject 註解的成員變量,去尋找依賴的bean對象
- 若是有多個,@Impl可用來指定某一個,不指定默認取第一個
- AopHelper(aop 編程)
addPluginProxy(proxyMap); // 插件代理
addAspectProxy(proxyMap); // 切面代理
addTransactionProxy(proxyMap); // 事務代理
![](http://static.javashuo.com/static/loading.gif)
-
// 建立 Proxy Map(用於 存放代理類 與 目標類列表 的映射關係)
Map<Class<?>, List<Class<?>>> proxyMap = createProxyMap();
// 建立 Target Map(用於 存放目標類 與 代理類列表 的映射關係)
Map<Class<?>, List<Proxy>> targetMap = createTargetMap(proxyMap);
![](http://static.javashuo.com/static/loading.gif)
- PluginHelper插件擴展須要注意哪些點
- 繼承自PluginProxy 抽象類
- 實現getTargetClassList 方法和doProxy 方法
- 繼承自Plugin 接口(WebPlugin 接口 web插件,多實現一個servlet註冊方法)
![](http://static.javashuo.com/static/loading.gif)
- 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 模式
- 單例
- 委派