• 如何开发一个java开源框架-----Jvn框架之实现用注解代替配置文件


    本次博客讲的内容:

    场景:在我们使用很多框架的时候,慢慢会发现写配置文件很烦,比如写一个小小的功能都要写几个配置文件。

            对于这一类问题,所以很多框架都出现了注解这一功能,那到底如何用注解代替配置文件呢?

       今天我们要做的是,扫描Class后找到我们所有Controller类,接下来我们就来讨论一下这个问题。

    解决思路:

            首先我们回想一下Spring的做法,Spring在使用注解的使用,必须在配置文件(这里指的是主配置文件)里面写上一句ScanClass的话,

            这句话代表的是启动扫描,然后会让你告诉他扫描的路径是哪个,于是我们的思路有了,我们要做到用注解代替配置文件,那也一样要做扫描

        这样一件事情。完成步奏如下:

        第一步:先创建 @Controller这个注解,用来标识是否属于Controller类,属性space()表示访问的路径。

            第二步:扫描 WebRoot/WEB-INF/classes/下面的所有文件,因为在Web标准里面Classes放的路径。

            第三步:过滤掉不是以.class结尾的文件;

        第四步:把“/”换成 “.”。例如  把 com/everxs/JvnConfig.class  转成  com.everxs.JvnConfig.class

        第五步:判断该类是否被 @Controller注解,如果是,则属于Controller.添加进map里面保存起来。

            做完了以上的步骤,我们就可以拿到所有Controller类了。

    代码示例:

    1,找出指定路径下的所有文件的文件名

    	/**
    	 * 返回路径下的所有file,并加入list
    	 * @return
    	 */
    	public static List<String> listFileAbsolutePath(String filePath,List<String> list){
    		
    		File root = new File(filePath);
    	    File[] files = root.listFiles();
    	    for(File file:files){     
    	     if(file.isDirectory()){
    	      /*
    	       * 递归调用
    	       */
    	    	 listFileAbsolutePath(file.getAbsolutePath(),list);
    	     }else{
    	    	 list.add(file.getAbsolutePath());
    
    	     }     
    	    }
    	    return list;
    	}
    

      

    2,过滤掉不是以.class结尾的,并用“.”替换掉"/",

    	/**
    	 * 返回路径下的所有file,并加入list
    	 * @return
    	 */
    	public static List<String> listClassFileAbsolutePath(String filePath){
    		List<String> list = new ArrayList<String>();
    		List<String> classList = new ArrayList<String>();
    		listFileAbsolutePath(filePath, list);
    		for(String s : list){
    			//如果是.class结尾的文件,则为class文件
    			if(s.endsWith(".class")){
    				//s = s.substring(filePath.length());
    				String ss = s.substring(filePath.length()-1);
    				//获取全类名称  把 comeverxsJvnConfig 换成 com.everxs.JvnConfig
    				String prefix = ss.substring(0,ss.length()-6).replace("\",".");
    				//添加进list
    				classList.add(prefix);
    			}
    		}
    	    return classList;
    	}
    

    3,找出被@Controller注解的类,保存在map里面

    /**
     * 扫描类
     * @author Administrator
     *
     */
    public class ScanKit {
    
    	public static void scanClass(Constant constant){
    		//拿到classes绝对路劲
    		String path = ScanKit.class.getClassLoader().getResource("").getPath();
    		//得到类的全名称  例如: con.everxs.test.TestController.class
    		List<String> listClass= FileKit.listClassFileAbsolutePath(path);
    		for(String clazzStr : listClass){
    			try {
    				//找到这个类全名称的Class
    				Class clazz = Class.forName(clazzStr);
    				
    				if(clazz!=null){
    					Controller controller= (Controller) clazz.getAnnotation(Controller.class);	
    			
    					if(controller!=null){
    						constant.setRoute(controller.space(), clazz);
    					}
    			
    				}
    			} catch (Exception e) {
    				System.out.println("找不到类文件");
    			}
    		}
    	}
    }
    

      

    4,在启动的时候启动扫描

    	/**
    	 * 扫描所有class
    	 */
    	public void sacnClass(){
    		ScanKit.scanClass(CONSTANT);
    	}
    

    5,测试

    @Controller(space = "/pile")
    public class PileController extends JvnController{
    
    	
    	public void add(){
    		renderString("add方法");
    	}
    	
    	public void delete(){
    		renderString("delete方法");
    	}
    }
    

    总结:

           这样就完成了我们用注解代替配置文件的过程了。

    关于Jvn:

        框架命名为Jvn,博客里有连续的开发视频,每一篇博文都是一个知识点,关于框架的介绍和学习,可以从我博客第一讲开始看起;

        本次内容的源码与视频下载地址:http://pan.baidu.com/s/1mgIKhXe

        Jvn框架QQ交流群:399603805

        博客首页:http://www.cnblogs.com/everxs/

        永远的八哥...

       

  • 相关阅读:
    oo第二阶段总结
    oo第一阶段总结
    散列函数的应用及其安全性
    【记下来,以后教给孩子玩】汉诺塔移动小窍门
    结对项目-四则运算出题程序(GUI版)
    读《构建之法》第四章、第十七章有感
    2016012002+小学四则运算练习软件项目报告
    Week2-作业1:阅读与博客
    阴差阳错是最好的安排
    2016011986卢琪信息安全作业5
  • 原文地址:https://www.cnblogs.com/everxs/p/4575131.html
Copyright © 2020-2023  润新知