本帖最后由 Mylo 于 2018-9-10 19:16 编辑
这部分只是简单模拟Spring生成对象,例如spring -> context 扫描生成对象 生成指定包下面含有指定注解的类的对象 ,只包含部分功能,后续完善 自定义注解@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCompoment {
String value() default "";
}
|
模拟的代码
package test.factory;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import test.anno.MyCompoment;
import test.anno.MyController;
import test.anno.MyDao;
import test.anno.MyService;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.*;
/**
* @program: workSet
* @description: test
* @author: Mylo
* @create: 2018-08-31 18:57
**/
public class Analyze {
//标签名 ---标签的内容 -> 属性名 属性的内容
private static Map<String , ArrayList<HashMap<String ,String>>> maps = new HashMap<>();
private static Map<String,Object> beanMaps = new HashMap<>();
static{
InputStream is = Analyze.class.getResourceAsStream("/my.xml");
SAXReader reader = new SAXReader();
try {
Document document = reader.read(is);
Element root = document.getRootElement();
List<Element> elements = root.elements();
/** 解析 TODO XML*/
for (Element element : elements) {
//判断当前的maps里面是否已经有这个标签
boolean flag = true;
ArrayList<HashMap<String, String>> values = maps.get(element.getName());
if(values == null){
flag = false;
values = new ArrayList<>();
}
//添加屬性
List<Attribute> attributes = element.attributes();
if (attributes != null && attributes.size() > 0){
HashMap<String , String> keysAndAalues = new HashMap<>();
for (Attribute attribute : attributes) {
keysAndAalues.put(attribute.getName(),attribute.getValue());
}
values.add(keysAndAalues);
}
if(!flag){
maps.put(element.getName(),values);
}
}
/** 解析 TODO XML*/
Set<String> tagsName = maps.keySet();
for (String s : tagsName) {
dom4j(s);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(beanMaps.get("student"));
}
private static void dom4j(String tag) {
if(tag.equals("context")){
//根据当前的标签获取对应的值
ArrayList<HashMap<String, String>> context = maps.get(tag);
for (HashMap<String, String> values : context) {
Set<Map.Entry<String, String>> entries = values.entrySet();
for (Map.Entry<String, String> entry : entries) {
//判断功能
if(entry.getKey().equalsIgnoreCase("packageToScan")){
String value = entry.getValue();
List<String> packages = new ArrayList<>();
if(value.contains(",")){
String[] packageNames = value.split(",");
packages = Arrays.asList(packageNames);
}else{
packages.add(value);
}
// System.out.println(packages);
creatBeanByPaht(packages);
}
}
}
}
if(tag.equals("bean")){
ArrayList<HashMap<String, String>> beans = maps.get(tag);
for (HashMap<String, String> bean : beans) {
Set<Map.Entry<String, String>> es = bean.entrySet();
String className = "";
String classPath = "";
for (Map.Entry<String, String> entry : es) {
if(entry.getKey().equals("id")){
className = entry.getValue();
}
if(entry.getKey().equals("class")){
classPath = entry.getValue();
}
}
try {
// System.out.println(classPath);
Class<?> clazz = Class.forName(classPath);
// System.out.println(classPath + "--" + clazz);
Object obj = clazz.newInstance();
beanMaps.put(className,obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//根据路径生成对象
private static void creatBeanByPaht(List<String> paths){
//beanMaps
for (String path : paths) {
try {
path = path.replace(".","/");
Enumeration<URL> resources = Analyze.class.getClassLoader().getResources(path);
path = path.replace("/","\\");
while(resources.hasMoreElements()){
String fileRealPath = resources.nextElement().getPath();
File file = new File(fileRealPath);
if(file!=null && file.listFiles().length > 0){
File[] files = file.listFiles();
for (File tempFile : files) {
if(tempFile.isFile() && tempFile.getName().contains(".class")){
String tempFilePath = tempFile.getAbsolutePath().substring(tempFile.getAbsolutePath().indexOf(path));
int dropIndex = tempFilePath.indexOf(".");
String fileName = tempFilePath.substring(0,dropIndex).replace("\\",".");
try {
Class<?> clazz = Class.forName(fileName);
//判断这个类不是一个接口 或者抽象类 如果不是就 生成对象
if(!Modifier.isInterface(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers())){
if(clazz.isAnnotationPresent(MyCompoment.class) || clazz.isAnnotationPresent(MyController.class) || clazz.isAnnotationPresent(MyService.class) || clazz.isAnnotationPresent(MyDao.class)){
String className = "";
MyCompoment myCompoment = clazz.getAnnotation(MyCompoment.class);
if(myCompoment != null){
className = myCompoment.value();
}
MyController myController = clazz.getAnnotation(MyController.class);
if(myController != null){
className = myController.value();
}
MyService myService = clazz.getAnnotation(MyService.class);
if (myService != null){
className = myService.value();
}
MyDao myDao = clazz.getAnnotation(MyDao.class);
if(myDao != null){
className = myDao.value();
}
//如果没有设置类名 就默认使用类名 首字母小写
if(className.equals("")){
className = clazz.getName().substring(clazz.getName().lastIndexOf(".") + 1);
className = className.substring(0,1).toLowerCase() + className.substring(1);
}
//创建对象
Object obj = clazz.newInstance();
beanMaps.put(className,obj);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
|
|