这部分只是简单模拟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"
);
new
SAXReader();
try
{Document document = reader.read(is)
;
;
;
/** 解析
TODO XML*/
for
(Element element : elements) {//判断当前的maps里面是否已经有这个标签
boolean
flag = true;
,
String>> values = maps
.get(element.getName());
if
(values == null
){flag =
false;
new
ArrayList<>();
//添加屬性
;
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"
)){//根据当前的标签获取对应的值
,
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()
;
new
ArrayList<>();
if
(value.contains(","
)){String[] packageNames = value.split(
","
);
;
else
{packages.add(value)
;
// System.out.println(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();
""
;
""
;
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);
;
// System.out.println(classPath + "--" + clazz);
;
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(
"."
,
"/"
);
class
.getClassLoader().getResources(path);
"/"
,
"
\\
"
);
while
(resources.hasMoreElements()){String fileRealPath = resources.nextElement().getPath()
;
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("."
);
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
);
0
,
1
).toLowerCase() + className.substring(1
);
//创建对象
;
beanMaps
.put(className,
obj);
}
}
catch
(Exception e) {e.printStackTrace()
;
}
}
}
}
}
catch
(IOException e) {e.printStackTrace()
;
}
}
}
更多技术资讯可关注:gzitcast