本次博客講的內容:
場景:在我們使用很多框架的時候,慢慢會發現寫配置文件很煩,比如寫一個小小的功能都要寫幾個配置文件。
對於這一類問題,所以很多框架都出現了注解這一功能,那到底如何用注解代替配置文件呢?
今天我們要做的是,掃描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);
//獲取全類名稱 把 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/
永遠的八哥...
