免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1338 | 回复: 0
打印 上一主题 下一主题

Jvn框架之实现用注解代替配置文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-15 11:31 |只看该作者 |倒序浏览
场景:在我们使用很多框架的时候,慢慢会发现写配置文件很烦,比如写一个小小的功能都要写几个配置文件。

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

   今天我们要做的是,扫描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,找出指定路径下的所有文件的文件名
  1. /**
  2. * 返回路径下的所有file,并加入list
  3. * @return
  4. */
  5. public static List<String> listFileAbsolutePath(String filePath,List<String> list){
  6.      
  7.     File root = new File(filePath);
  8.     File[] files = root.listFiles();
  9.     for(File file:files){   
  10.      if(file.isDirectory()){
  11.       /*
  12.        * 递归调用
  13.        */
  14.          listFileAbsolutePath(file.getAbsolutePath(),list);
  15.      }else{
  16.          list.add(file.getAbsolutePath());

  17.      }   
  18.     }
  19.     return list;
  20. }
复制代码
2,过滤掉不是以.class结尾的,并用“.”替换掉"/",
  1. /**
  2. * 返回路径下的所有file,并加入list
  3. * @return
  4. */
  5. public static List<String> listClassFileAbsolutePath(String filePath){
  6.     List<String> list = new ArrayList<String>();
  7.     List<String> classList = new ArrayList<String>();
  8.     listFileAbsolutePath(filePath, list);
  9.     for(String s : list){
  10.         //如果是.class结尾的文件,则为class文件
  11.         if(s.endsWith(".class")){
  12.             //s = s.substring(filePath.length());
  13.             String ss = s.substring(filePath.length()-1);
  14.             //获取全类名称  把 com\everxs\JvnConfig 换成 com.everxs.JvnConfig
  15.             String prefix = ss.substring(0,ss.length()-6).replace("\\",".");
  16.             //添加进list
  17.             classList.add(prefix);
  18.         }
  19.     }
  20.     return classList;
  21. }
复制代码
3,找出被@Controller注解的类,保存在map里面
  1. /**
  2. * 扫描类
  3. * @author Administrator
  4. *
  5. */
  6. public class ScanKit {

  7.     public static void scanClass(Constant constant){
  8.         //拿到classes绝对路劲
  9.         String path = ScanKit.class.getClassLoader().getResource("").getPath();
  10.         //得到类的全名称  例如: con.everxs.test.TestController.class
  11.         List<String> listClass= FileKit.listClassFileAbsolutePath(path);
  12.         for(String clazzStr : listClass){
  13.             try {
  14.                 //找到这个类全名称的Class
  15.                 Class clazz = Class.forName(clazzStr);
  16.                  
  17.                 if(clazz!=null){
  18.                     Controller controller= (Controller) clazz.getAnnotation(Controller.class);
  19.             
  20.                     if(controller!=null){
  21.                         constant.setRoute(controller.space(), clazz);
  22.                     }
  23.             
  24.                 }
  25.             } catch (Exception e) {
  26.                 System.out.println("找不到类文件");
  27.             }
  28.         }
  29.     }
  30. }
复制代码
4,在启动的时候启动扫描
  1. /**
  2. * 扫描所有class
  3. */
  4. public void sacnClass(){
  5.     ScanKit.scanClass(CONSTANT);
  6. }
复制代码
5,测试
  1. @Controller(space = "/pile")
  2. public class PileController extends JvnController{

  3.      
  4.     public void add(){
  5.         renderString("add方法");
  6.     }
  7.      
  8.     public void delete(){
  9.         renderString("delete方法");
  10.     }
  11. }
复制代码
总结:

       这样就完成了我们用注解代替配置文件的过程了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP