分享

手写一个Spring工厂,扫描包名下的信息

 金银宝100 2017-12-16
package project.demo;
import java.io.File;
import java.io.FileFilter;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import Spring.demo.demo;
public class annot {
private Map<String, Object> bmap = new HashMap<>();
/*
* 3.尝试基于注解的形式写一个Spring工厂 1) 给定一个包,包中几个类 2) 定义一个工厂,扫描指定包中的类 3) 基于反射构建所有类的对象
* 4) 将对象存储于工厂对应的容器中(Map类型)
*/
public annot() {
String pkg = "project.demo";
scanpkg(pkg);
}

// 扫描指定包,找到包中的类文件
private void scanpkg(String pkg) {
// 1 替换包中的. ,为目录路径
String pkgd = pkg.replaceAll("\\.", "/");
System.out.println("00--"+pkgd); // project/demo(包名)
// 2 获取目录结构在类路径中的位置(URL中封装了你具体资源路径)
URL url = getClass().getClassLoader().getResource(pkgd);
// System.out.println("url:"+url); //
// file:/D:/workspace/day3-1/bin/project/demo
// 3 构建一个文件对象
File file = new File(url.getFile());
// System.out.println("file:"+file); //
// D:\workspace\day3-1\bin\project\demo
// 4 获取目录指定.class文件
File fs[] = file.listFiles(new FileFilter() {
public boolean accept(File file) {
// 获取文件名
String fname = file.getName();
System.out.println("1---" + fname); // serdemo.class
// 判断是否是目录
if (file.isDirectory()) {
System.out.println("开始递归:"+pkg + "." + fname);
scanpkg(pkg + "." + fname); // 包名+类名
} else {
// 判断文件的后缀是否是.class
if (fname.endsWith(".class")) {
return true;
}
}
return false;
}
});
for (File f : fs) {
// 1获取文件名
String fname = f.getName();
System.out.println("2--" + fname); // serdemo.class
// 2 获取去除.class 以后的文件名
String str = fname.substring(0, fname.lastIndexOf("."));
System.out.println("3--" + str); // serdemo
// 3将名字的第一个字母转换小写(用它作为key存储map)
String key = String.valueOf(fname.charAt(0)).toLowerCase() + str.substring(1);
System.out.println("4--" + key);
// 4构建一个类全名(包名.类名)
String pkgcls = pkg + "." + str;
System.out.println("5--" + pkgcls);
try {
// 通过反射构建对象
Class<?>  c=Class.forName(pkgcls);
if(c.isAnnotationPresent(demo.class)){
Object  obj=c.newInstance();
System.out.println("创建的对象:"+obj);
// 将对象存储到map容器中
bmap.put(key, obj);
}
//Object obj = Class.forName(pkgcls).newInstance();
//System.out.println("6--" + obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

public Object getBean(String key) {
return bmap.get(key);
}

public void close() {
bmap.clear();
bmap = null;
}
public static void main(String[] args) {
annot at = new annot();
Object obj=at.getBean("condemo");
System.out.println("obj="+obj);
at.close();
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多