1.首先解析xml文件用的dom4j-1.6.1.jar包。
2.google一下dom4j的使用:(如下图)
3.创建一个实体类:
package com.buaa.bean;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4.创建一个接口UserDao:
package com.buaa.dao;
import com.buaa.bean.User;
public interface UserDao {
public void add(User u);
}
5.创建一个UserDao的实现类:
package com.buaa.dao.impl;
import com.buaa.bean.User;
import com.buaa.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void add(User u) {
System.out.println("a user saved!");
}
}
6.创建一个UserService:
package com.buaa.service;
import com.buaa.bean.User;
import com.buaa.dao.UserDao;
public class UserService {
private UserDao userDao;
public void add(User u){
userDao.add(u);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
7.写一个Spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="com.buaa.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.buaa.service.UserService">
<property name="userDao" bean="userDao"/>
</bean>
</beans>
8.创建一个工厂类:
package com.buaa.spring_emulator;
public interface BeanFactory {
public Object getBean(String name);
}
9.创建一个模拟spring中的类ClassPathXmlApplicationContext:
package com.buaa.spring_emulator;
import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ClassPathXmlApplicationContext implements BeanFactory{
Map<String,Object> beans = new HashMap<String,Object>();
public ClassPathXmlApplicationContext() throws Exception{
SAXReader reader = new SAXReader();
String separator = System.getProperty("file.separator");
File xmlFile = new File(System.getProperty("user.dir")+ separator + "src" + separator + "spring.xml");
Document doc = reader.read(xmlFile);
Element root = doc.getRootElement();
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
String id = element.attributeValue("id");
String clazz = element.attributeValue("class");
Object o = Class.forName(clazz).newInstance();
beans.put(id, o);
/*List<Element> child = element.elements();
for(Element c:child){
String name = c.attributeValue("name");
String bean = c.attributeValue("bean");
System.out.println(name);
System.out.println(bean);
Object beanObject = getBean(bean);
String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
Method m = o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]);
m.invoke(o, beanObject);
}*/
for(Iterator j = element.elementIterator();j.hasNext();){
Element property = (Element)j.next();
String name = property.attributeValue("name");
String bean = property.attributeValue("bean");
Object beanObject = getBean(bean);
String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
Method m = o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]);
m.invoke(o, beanObject);
}
}
}
@Override
public Object getBean(String name) {
return beans.get(name);
}
}
10.Junit测试类:
package com.buaa.service;
import org.junit.Test;
import com.buaa.bean.User;
import com.buaa.spring_emulator.BeanFactory;
import com.buaa.spring_emulator.ClassPathXmlApplicationContext;
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
BeanFactory factory = new ClassPathXmlApplicationContext();
UserService userService = (UserService)factory.getBean("userService");
User u = new User();
userService.add(u);
}
}