Sping的主要功能就是省去了我们自己创建对象的麻烦,下面就用一个简单的例子,利用Java的DOM解析、反射机制简单实现Spring工厂。当然这是简单实现,没有实际spring工厂那么复杂。但是原理基本就是这样了。
1.在eclipse跟目录中创建我们所熟悉的beans.xml文件:我存放的路径为根目录。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="user" class="com.lwk.springbean.User">
<property name="username" value="李卫康"></property>
<property name="password" value="123456"></property>
</bean>
</beans>
2.在com.lwk.springbean包路径下创建User类
package com.lwk.springbean;
/**
* @author 作者 E-mail:李卫康
* @version 创建时间:2017年7月7日 下午1:52:23
* 类说明
*/
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return username+":"+password;
}
}
3.在com.lwk.demo包路径下创建SpringBeanFactory.java文件
package com.lwk.springbean;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* @author 作者 E-mail:李卫康
* @version 创建时间:2017年7月7日 下午1:50:24
* 类说明:spring工厂类
*/
public class SpringBeanFactory {
private static Map<String, Object> map=new HashMap<>();
public static void main(String[] args) {
init();
}
public static void init(){
try {
//1.加载配置文件(使用相对路径)
InputStream in = SpringBeanFactory.class.getResourceAsStream("../../../beans.xml");
SAXReader reader=new SAXReader();
Document document = reader.read(in);
//2.得到配置文件的根节点
Element element = document.getRootElement();
List <Element>elements = element.elements();
for(Element e:elements){
Attribute id = e.attribute("id");
Attribute clazz = e.attribute("class");
Class<?> bean = Class.forName(clazz.getText());
User user = (User) bean.newInstance();
List<Element> properties = e.elements();
for(Element pro:properties){
Attribute name = pro.attribute("name");
Attribute value = pro.attribute("value");
user.setUsername(name.getData().toString());
user.setPassword(value.getData().toString());
}
map.put(id.getText(), user);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object getBean(String id){
return map.get(id);
}
}
4.最后编写测试类
public class SpringDemo {
public static void main(String[] args) {
SpringBeanFactory.init();
User user = (User) SpringBeanFactory.getBean("user");
System.out.println(user.toString());
}
}
5.运行结果为:password:123456