2019独角兽企业重金招聘Python工程师标准>>>

持有者Container.java持有,所有的控制器和拦截器实例,多个拦截器构成拦截器链。

初始化控制器:非常简单,在DispatcherServlet初始化时,调用它Container.init(config),init方法里查找所有class文件,有Mapping注解的方法,校验后,即为控制器。

初始化拦截器:同上。Mapping注解有2个参数url,cmi,其中cmi为自定义拦截器(cmi为c:controller,m:me,i:interceptor)。Container.java代码如下:

package cn.eternal.container;import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import cn.eternal.annotation.Mapping;
import cn.eternal.config.Config;
import cn.eternal.config.ConfigException;
import cn.eternal.handler.InstanceHandler;
import cn.eternal.handler.MappingHandler;
import cn.eternal.interceptor.EmptyInterceptor;
import cn.eternal.interceptor.Interceptor;
import cn.eternal.renderer.Renderer;
import cn.eternal.util.ConverterUtil;
public class Container {private static Log log = LogFactory.getLog(Container.class);public static Map<MappingHandler,Interceptor[]> interceptors = new HashMap<MappingHandler,Interceptor[]>();public static MappingHandler[] MappingHandlers = null;public static Map<MappingHandler, InstanceHandler> mhih = new HashMap<MappingHandler, InstanceHandler>();private static ConverterUtil converterUtil = new ConverterUtil();public static void init(final Config config) throws ClassNotFoundException, InstantiationException, IllegalAccessException{initControllersAndInterceptors(config);}static void warnInvalidInstanceHandlerMethod(Method m, String string) {log.warn("Init Invalid Controller method '" + m.toGenericString() + "': " + string);}public static void initControllersAndInterceptors(Config config) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ClassLoader cld = Thread.currentThread().getContextClassLoader();URL resource = cld.getResource("/");File dirs = new File(resource.getFile());ArrayList<Class> classList = new ArrayList<Class>();findClass(dirs,"",classList);findControllersAndInterceptors(classList,config.getInitParameter("interceptors"));MappingHandlers = mhih.keySet().toArray(new MappingHandler[mhih.size()]);Arrays.sort(MappingHandlers,new Comparator<MappingHandler>() {public int compare(MappingHandler o1, MappingHandler o2) {String u1 = o1.url;String u2 = o2.url;int n = u1.compareTo(u2);if (n==0)throw new ConfigException("Cannot mapping one url '" + u1 + "' to more than one Controller method.");return n;}});}private static void findClass(File dirs,String basePack,ArrayList<Class> classList)throws ClassNotFoundException {File[] childs = dirs.listFiles();for (int i = 0; i < childs.length; i++) {String packPath =basePack+childs[i].getName()+".";if (childs[i].isDirectory()) {findClass(childs[i],packPath,classList);} else {String className = childs[i].getName();if (className.endsWith(".class")) {packPath=packPath.replace(".class.", "");classList.add(Class.forName(packPath));}}}}private static void findControllersAndInterceptors(ArrayList<Class> classLst,String inters)throws InstantiationException, IllegalAccessException, ClassNotFoundException {for (int c = 0; c < classLst.size(); c++) {Class clazz = classLst.get(c);Method mArr[] = clazz.getDeclaredMethods();for (Method m:mArr) {if (isControllerMethod(m)) {Mapping mapping = m.getAnnotation(Mapping.class);String url = mapping.url();MappingHandler matcher = new MappingHandler(url);if (matcher.getArgumentCount()!=m.getParameterTypes().length) {warnInvalidInstanceHandlerMethod(m, "Arguments in URL '" + url + "' does not match the arguments of method.");continue;}log.info("Init Controller "+m.toGenericString()+" Mapping url '" + url + "'.");mhih.put(matcher, new InstanceHandler(clazz.newInstance(), m));Class cmi = mapping.cmi();String cinters = "";if(cmi != null && cmi != EmptyInterceptor.class){if(inters != "" && inters != null){cinters = ","+cmi.getName();log.info("Init Interceptor "+cmi.getName()+" For "+m.toGenericString()+".");}}addInterceptors(matcher,(inters+cinters).split(","));}}}}static void addInterceptors(MappingHandler matcher,String[] inters) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Interceptor[] interArr = new Interceptor[inters.length];for(int i=0;i<inters.length;i++){interArr[i] = (Interceptor)(Class.forName(inters[i])).newInstance();}interceptors.put(matcher,interArr);}static boolean isControllerMethod(Method m) {Mapping mapping = m.getAnnotation(Mapping.class);if (mapping==null)return false;if (mapping.url().length()==0) {warnInvalidInstanceHandlerMethod(m, "Url mapping cannot be empty.");return false;}if (Modifier.isStatic(m.getModifiers())) {warnInvalidInstanceHandlerMethod(m, "method is static.");return false;}Class<?>[] argTypes = m.getParameterTypes();for (Class<?> argType : argTypes) {if (!converterUtil.canConvert(argType)) {warnInvalidInstanceHandlerMethod(m, "unsupported parameter '" + argType.getName() + "'.");return false;}}Class<?> retType = m.getReturnType();if (retType.equals(void.class)|| retType.equals(String.class)|| Renderer.class.isAssignableFrom(retType))return true;warnInvalidInstanceHandlerMethod(m, "unsupported return type '" + retType.getName() + "'.");return false;}public static void destroy() {interceptors = null;MappingHandlers = null;mhih = null;converterUtil = null;}public static MappingHandler[] getMappingHandlers() {return MappingHandlers;}public static Map<MappingHandler, InstanceHandler> getMhih() {return mhih;}public static Interceptor[] getInterceptors(MappingHandler matcher) {return interceptors.get(matcher);}
}

Mapping.java代码:

package cn.eternal.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import cn.eternal.interceptor.EmptyInterceptor;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Mapping {String url();Class<?> cmi() default EmptyInterceptor.class;
}

转载于:https://my.oschina.net/eternal/blog/100759

4、Eternal框架-持有者相关推荐

  1. 3、Eternal框架-控制器

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC:Model-View-Controller,包括三类对象,Model模型对象.View视图表示.Controll ...

  2. 2、Eternal框架-svn_有更新!

    2019独角兽企业重金招聘Python工程师标准>>> 我在code.google.com上建立了eternal项目. 下载地址为:http://code.google.com/p/ ...

  3. 26、Eternal框架v2-框架设计 前置分发器 1、代码

    2019独角兽企业重金招聘Python工程师标准>>> package cn.eternal.web;import cn.eternal.web.core.Dispatcher; i ...

  4. 开发自己的山寨Android注解框架

    目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...

  5. 如何在机器学习的框架里实现隐私保护?

    编者按:数据时代,人们从技术中获取便利的同时,也面临着隐私泄露的风险.微软倡导负责任的人工智能,因此机器学习中的隐私保护问题至关重要.本文介绍了目前机器学习中隐私保护领域的最新研究进展,讨论了机密计算 ...

  6. 还在用Spring Security?推荐你一款使用简单、功能强大的权限认证框架

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/qq_40058629/article/ details/116692302 我们先看一下官网介绍 ...

  7. Java 程序员如何使用 Shiro 框架

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:冷豪 来自:www.cnblogs.com/learnhow ...

  8. java Cache框架

    Cache框架乱炖 各类开源的缓存解决方案 JBossCache/TreeCache JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让你 ...

  9. 三大缓存框架ehcache、memcache和redis的介绍

    三大缓存框架ehcache.memcache和redis的介绍 2016-04-12 架构说 4964 阅读 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存 ...

最新文章

  1. 关于路径的使用,assi下载和
  2. day3.python 学习之列表
  3. JDBC第一篇之获得数据库连接
  4. [翻译][1.4.2]Flask-Admin入门介绍
  5. centos7.4 ngixn1.13.10 mysql5.7.21 php7.2.3 源码编译安装之后php无法连接mysql
  6. C语言面试题分享(6)
  7. 分支定义之Trunk vs Master
  8. 服务器绑定域名可修改吗,云服务器可以绑定域名吗
  9. MYSQL为什么long_query_time设置了1秒,slow log中记录了小于1秒的慢查询
  10. 软件的艺术之美源于权衡(Trade-off)
  11. 重构改善既有代码设计--重构手法19:Replace Data Value with Object (以对象取代数据值)...
  12. [设计模式-行为型]策略模式(Strategy)
  13. _IO, _IOR, _IOW, _IOWR 宏的用法与解析
  14. 信道编码与信源编码基本
  15. Java实现图片上传到服务器,并把上传的图片读取出来
  16. php提取字符串连接,如何从PHP中的字符串中提取URL?
  17. Unity3D的传送带和物体移动
  18. 教授专栏11|张处:企业支付政策和信用风险:来自信用违约掉期(CDS)市场的证据
  19. Scratch教程——完整的跳跃
  20. J2EE开发实战基础系列一 HelloWorld

热门文章

  1. 清华计算机本科高中准备 知乎,什么是清华大学的定向生?清华大学定向生到底要不要报考?(知乎...
  2. android rom 评测,腾讯定制Android 4.0 ROM评测 附tati刷机教程
  3. as cast float server sql_SQL-Server(五)T-SQL语言
  4. Maven 私服搭建指南
  5. 五分钟看完 RocketMQ应用
  6. 今天谈一谈python自动化测试中使用异步
  7. mysql在建站起什么作用_数据库操作对比:Sql Server与MYSQL相比有哪些建站优势?...
  8. android获取时区时间格式,考虑时区的日期/时间转换-Android
  9. c语言精品课程网站论文免费下载,【毕业论文_c语言程序设计精品课程网站的研究与实现6喜欢就下吧材料】...
  10. Note:一些优化建议