1、框架伴随tomcat 启动初始化
- ContainerListener 容器监听器
- // 初始化相关 Helper 类 HelperLoader.init();
- // 添加 Servlet 映射 addServletMapping(servletContext);
- // 注册 WebPlugin(所有插件) registerWebPlugin(servletContext);
2、HelperLoader.init();
- true 传的很关键,类加载并且初始化
- 也就是,下述类的静态代码块会被执行
- DatabaseHelper
- 封装数据库相关操作
- ThreadLocal 模式 每个线程都有单独的链接(可以改成线程池)
- @Service(类注解)、(方法注解)
- 使用动态代理处理 注解的方法
- 基于 Apache Commons DbUtils 实现
- EntityHelper
- 如下图entityClassTableNameMap、entityClassFieldMapMap 保存 注解类和数据库表之间关系
- 三个注解@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);
-
// 调用 HandlerhandlerInvoker.invokeHandler(request, response, handler);
- 视图解析器ViewResolver执行方法resolveView 完成跳转
-
// 处理 Action 异常handlerExceptionResolver.resolveHandlerException(request, response, e);
-
- mvc 核心分发器
- 封装文件上传相关操作: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
, List >> proxyMap = createProxyMap();// 创建 Target Map(用于 存放目标类 与 代理类列表 的映射关系)Map , List > 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 框架。
- 继承自PluginProxy 抽象类
- 以cache 注解为例:
- CacheProxy 继承自PluginProxy
- 动态代理被@Cachable注解的类,分两种情况对被 @CachePut、@CacheClear 注解的方法、链式处理数据流
- CachePlugin 实现了Plugin 接口
- 在init() 方法中启动线程,每隔5秒清理下过期的缓存
- CacheProxy 继承自PluginProxy
用到的设计模式:
- 工厂方法
- 动态代理(cglib)
- 责任链
- 模板方法
- 建造者
- ThreadLocal 模式
- 单例
- 委派