如何開發一個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/

    永遠的八哥...

相關文章
相關標籤/搜索