smartFramework 源码分享纲要

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(类注解)、@Transaction(方法注解)
      • 使用动态代理处理 @Transaction 注解的方法
      • 基于 Apache Commons DbUtils 实现
  • EntityHelper
    • 如下图entityClassTableNameMap、entityClassFieldMapMap 保存@Entity 注解类和数据库表之间关系
    • 三个注解@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);
        • // 调用 Handler
          handlerInvoker.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<Class<?>, List<Class<?>>> proxyMap = createProxyMap();
    // 创建 Target Map(用于 存放目标类 与 代理类列表 的映射关系)
    Map<Class<?>, List<Proxy>> 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值