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

本次博客讲的内容:java

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

        对于这一类问题,因此不少框架都出现了注解这一功能,那到底如何用注解代替配置文件呢?学习

   今天咱们要作的是,扫描Class后找到咱们全部Controller类,接下来咱们就来讨论一下这个问题。测试

解决思路:spa

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

        这句话表明的是启动扫描,而后会让你告诉他扫描的路径是哪一个,因而咱们的思路有了,咱们要作到用注解代替配置文件,那也同样要作扫描blog

    这样一件事情。完成步奏以下:递归

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

        第二步:扫描 WebRoot/WEB-INF/classes/下面的全部文件,由于在Web标准里面Classes放的路径。get

        第三步:过滤掉不是以.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);
				//获取全类名称  把 com\everxs\JvnConfig 换成 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/

    永远的八哥...

相关文章
相关标签/搜索