smartFramework 源码分享纲要

安稳与你 提交于 2019-11-30 23:16:27

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

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

2、HelperLoader.init();

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

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

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

  • 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里面进行处理
  • BeanHelper(初始化相关 Bean 类)
    • @Bean、@Service、@Action、@Aspect
    • 上述注解的就是需要创建实例的Bean,存入Map<Class<?>, Object> beanMap
  • IocHelper(初始化ioc 容器)
    • 处理带@Inject 注解的成员变量,去寻找依赖的bean对象
    • 如果有多个,@Impl可用来指定某一个,不指定默认取第一个
  • AopHelper(aop 编程)
addPluginProxy(proxyMap);      // 插件代理
addAspectProxy(proxyMap);      // 切面代理
addTransactionProxy(proxyMap); // 事务代理
  • 插件注解举例

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

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

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!