博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
smartFramework 源码分享纲要
阅读量:6735 次
发布时间:2019-06-25

本文共 2298 字,大约阅读时间需要 7 分钟。

hot3.png

1、框架伴随tomcat 启动初始化

037bf55e64d0aed679bebc182856574ef74.jpg

  • ContainerListener 容器监听器
    • // 初始化相关 Helper 类 HelperLoader.init();
    • // 添加 Servlet 映射 addServletMapping(servletContext);
    • // 注册 WebPlugin(所有插件) registerWebPlugin(servletContext);

2、HelperLoader.init();

  • true 传的很关键,类加载并且初始化

a73d042dc4eb4eb81e13b4ca35387d59a61.jpg

  • 也就是,下述类的静态代码块会被执行

ee1f1ada590b15bb0acfa6ce5eec946c11a.jpg

  • DatabaseHelper
    • 封装数据库相关操作
    • ThreadLocal 模式 每个线程都有单独的链接(可以改成线程池)
    • @Service(类注解)、(方法注解)
      • 使用动态代理处理  注解的方法
      • 基于 Apache Commons DbUtils 实现
  • EntityHelper
    • 如下图entityClassTableNameMap、entityClassFieldMapMap 保存 注解类和数据库表之间关系
    • 三个注解@Table、@Column、@Entity
      • 默认驼峰与下划线互转
      • 如果标注@Table、@Column,不转直接取值
        • 用于不满足驼峰与下划线互转的情况,特殊处理

3df570f2e1d53c40c2a87678498f5de7069.jpg

  • 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);
        • // 调用 HandlerhandlerInvoker.invokeHandler(request, response, handler);
          • 视图解析器ViewResolver执行方法resolveView 完成跳转
        • // 处理 Action 异常handlerExceptionResolver.resolveHandlerException(request, response, e);
    • 封装文件上传相关操作:UploadHelper
      • 在DispatcherServlet 初始化时进行初始化
      • 上传也是一次servlet 请求,service里面进行处理
    • fb2eda1f7e5bf51e9a7d7784619f7fe6aa1.jpg
  • BeanHelper(初始化相关 Bean 类)
    • @Bean、@Service、@Action、@Aspect
    • 上述注解的就是需要创建实例的Bean,存入Map<Class<?>, Object> beanMap
  • IocHelper(初始化ioc 容器)
    • 处理带@Inject 注解的成员变量,去寻找依赖的bean对象
    • 如果有多个,@Impl可用来指定某一个,不指定默认取第一个
  • AopHelper(aop 编程)
addPluginProxy(proxyMap);      // 插件代理addAspectProxy(proxyMap);      // 切面代理addTransactionProxy(proxyMap); // 事务代理
  • 插件注解举例

87560eecab1c25346baf1922dad0a370efd.jpg

  • // 创建 Proxy Map(用于 存放代理类 与 目标类列表 的映射关系)Map
    , List
    >> proxyMap = createProxyMap();// 创建 Target Map(用于 存放目标类 与 代理类列表 的映射关系)Map
    , List
    > targetMap = createTargetMap(proxyMap);

0b0e8905bf73946948d61220ff96e2cd653.jpg

  • PluginHelper插件扩展需要注意哪些点  
    • 继承自PluginProxy 抽象类
      • 实现getTargetClassList 方法和doProxy 方法
    • 继承自Plugin 接口(WebPlugin 接口 web插件,多实现一个servlet注册方法)
      • dc28964ab155201f66b13c63c6e995764c5.jpg
      • 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 模式
  • 单例
  • 委派

 

 

转载于:https://my.oschina.net/u/3847203/blog/2254022

你可能感兴趣的文章
windows下,在任意文件夹右键添加打开命令窗口(包括以管理员方式)
查看>>
关于java在用jdbc技术往mysql数据库插入数据出现乱码问题的解决方案
查看>>
Linux磁盘阵列和lvm逻辑卷_李强强
查看>>
MySql索引那些事
查看>>
如何查看mac的格式磁盘(开通头条号)
查看>>
Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代
查看>>
基于Google云存储的开放Maven镜像中央仓库
查看>>
Oracle存储过程基本语法介绍(转)
查看>>
egret笔记之gui内设置动画效果
查看>>
JQuery - only child
查看>>
javaProject中复制jar包
查看>>
基于FMDB的数据库操作
查看>>
超赞的 JavaScript 就query 图形图表绘制插件
查看>>
HibernateTemplate() 获取最大记录数/记录总数/总数
查看>>
PIL处理图像(一)
查看>>
Clojure程序设计
查看>>
C# 获取Sqlite数据库路径的问题
查看>>
如何得到DropBoxManager
查看>>
ASMSupport教程3:动态生成接口
查看>>
Maven:Hello World
查看>>