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);
//获取全类名称把 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方法");
}
}总结:
这样就完成了我们用注解代替配置文件的过程了。
页:
[1]