基于上次简单的模拟spring有重新写了个模拟spring的IOC的程序:
package com.gd.model; /** * * @author sandy * */ public class User { private String username; private String password; /** * @return the username */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the password */ public String getPassword() { return password; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } }
package com.gd.dao; import com.gd.model.User; /** * * @author sandy * */ public interface UserDao { void addUser(User user); }
/** * */ package com.gd.dao.impl; import com.gd.dao.UserDao; import com.gd.model.User; /** * @author sandy * */ public class UserDaoImpl implements UserDao { public void addUser(User user) { System.out.println("添加用户名称为:"+user.getUsername()+"的用户成功!"); } }
package com.gd.service; import com.gd.model.User; /** * * @author sandy * */ public interface UserService{ void addUser(User user); }
/** * */ package com.gd.dao.service.impl; import com.gd.dao.UserDao; import com.gd.model.User; import com.gd.service.UserService; /** * @author sandy * */ public class UserServiceImpl implements UserService { UserDao userDao; public void addUser(User user) { this.userDao.addUser(user); } /** * @param userDao the userDao to set */ public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
/** * */ package com.gd.spring; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; /** * @author sandy * 从classpath环境配置读取配置文件 该类实现了Bean工厂接口 */ public class ClasspathXmlApplicationContext implements BeanFactory { //定义一个存放bean信息的容器 private Map<String, Object> container = new HashMap<String, Object>(); //把传进来fileName文件用dom4j的方式解析,把解析后的结果放到容器container中 @SuppressWarnings("unchecked") public ClasspathXmlApplicationContext(String fileName) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { SAXReader reader = new SAXReader(); Document document; try { document = reader.read(this.getClass().getClassLoader() .getResourceAsStream(fileName)); Node root = document.selectSingleNode("/beans"); List list = root.selectNodes("bean"); for (Object object : list) { Element element = (Element) object; String beanId = element.attributeValue("id"); Object clazz = Class.forName(element.attributeValue("class")) .newInstance(); container.put(beanId, clazz); Iterator<Element> iter = element.elementIterator(); while (iter.hasNext()) { Element propertyElement = iter.next(); //获取property中的name="userDao"的值 String name = propertyElement.attributeValue("name"); //获取property中的bean="udao"的值 String bean = propertyElement.attributeValue("bean"); //获取bean="udao"的bean对象 Object beanObject = container.get(bean); //拼装setUserDao方法 String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); System.out.println(methodName); //通过反射方式获取setUserDao方法 Method method = clazz.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); //调用service的setUserDao方法 method.invoke(clazz, beanObject); } } } catch (DocumentException e1) { e1.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } //根据beanId来从容器中获得bean的实例 public Object getBean(String beanId) { return container.get(beanId); } }
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="udao" class="com.gd.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.gd.dao.service.impl.UserServiceImpl"> <property name="userDao" bean="udao"/> </bean> </beans>
客户端测试代码:
package com.gd.service; import java.lang.reflect.InvocationTargetException; import org.junit.Test; import com.gd.model.User; import com.gd.spring.BeanFactory; import com.gd.spring.ClasspathXmlApplicationContext; /** * * @author sandy * */ public class TestUserService { @Test public void addUser() throws SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException { User u = new User(); u.setUsername("lgd"); BeanFactory factory = new ClasspathXmlApplicationContext( "applicationContext.xml"); UserService service = (UserService) factory.getBean("userService"); service.addUser(u); } }