手写Spring配置文件开发
思路:
1、通过解析配置文件获取类的全限定类名
2、通过反射来创建对象,避免使用new关键字
xml文件:
<-- xml文件内容 -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userMapperImpl" class="com.hjj.mapper.impl.UserMapperImpl"></bean>
<bean id="userServiceImpl" class="com.hjj.service.impl.UserServiceImpl">
<property name="userMapper" ref="userMapperImpl"></property>
</bean>
<bean id="userController" class="com.hjj.controller.UserController">
<property name="userService" ref="userServiceImpl"></property>
</bean>
</beans>
代码:
import com.hjj.controller.UserController;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class Resole_XML {
private static Map<String,String> map;
private static Map<String, Map<String,String>> pros;
// private static Map<String,Object> object = new HashMap<>();
public static void main(String[] args) throws Exception{
//获取输出流
InputStream in = Resole_XML.class.getClassLoader().getResourceAsStream("My_Spring_Config.xml");
init(in);
UserController userController = (UserController)getObject("userController");
userController.login();
}
//从工厂获取对象
public static Object getObject(String id) throws Exception{
return factory(id,null);
}
//工厂方法生产对象
public static Object factory(String id,Object obj) throws Exception{
for(Map.Entry<String,String> entry : map.entrySet()){
String key = entry.getKey();
if(id.equals(key)){
String className = entry.getValue();
Class cls = Class.forName(className);
if(obj == null){
//如果是第一次传入
obj = cls.newInstance();
}
if(pros.get(id).size() < 1){
return obj;
}
for(Map.Entry<String,String> entry2 : pros.get(id).entrySet()){
String filedName = entry2.getKey();
String className2 = entry2.getValue();
String methonName = "set"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
Field field = cls.getDeclaredField(filedName);
Method method = cls.getDeclaredMethod(methonName,field.getType());
Object value = Class.forName(className2).newInstance();
method.invoke(obj,value);
//自己调自己,递归
factory(filedName+"Impl",value);
}
}
}
return obj;
}
//通过Jsoup获取配置文件信息,并存储信息到map集合
public static void init(InputStream in) throws Exception{
map = new HashMap<>();
pros = new HashMap<>();
//解析xml配置文件
Document parse = Jsoup.parse(in, "utf-8", "http://www.google.de");
//获取bean标签
Elements beans = parse.select("bean");
for (Element bean : beans) {
String id = bean.attr("id");
String cls = bean.attr("class");
map.put(id,cls);
Map<String,String> m = new HashMap<>();
Elements property = bean.select("property");
for (Element prop : property) {
String filedName = prop.attr("name").replace("Impl","");
String ref = property.attr("ref");
for (Element bean2 : beans) {
if (bean2.attr("id").equals(ref)){
cls = bean2.attr("class");
}
}
m.put(filedName,cls);
}
pros.put(id,m);
}
}
}