模拟Spring的兑现
模拟Spring的实现
BeanFactory.java
Test.java
UserDao.java
ClassPathXmlApplicationContext.java
package com.ig.sd.spring; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String, Object> beans = new HashMap<String, Object>(); public ClassPathXmlApplicationContext() throws Exception { SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(this.getClass().getClassLoader() .getResourceAsStream("beans.xml")); Element root = doc.getRootElement(); List<?> list = root.getChildren("bean"); for (int i = 0; i < list.size(); i++) { Element element = (Element) list.get(i); String id = element.getAttributeValue("id"); String clazz = element.getAttributeValue("class"); System.out.println(id + ":" + clazz); Object o = Class.forName(clazz).newInstance(); beans.put(id, o); for (Element propertyElement : (List<Element>) element .getChildren("property")) { String name = propertyElement.getAttributeValue("name"); String bean = propertyElement.getAttributeValue("bean"); Object beanObject = beans.get(bean); String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); System.out.print(methodName); Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]); m.invoke(o, beanObject); } } } @Override public Object getBean(String name) { // TODO Auto-generated method stub return beans.get(name); } }
BeanFactory.java
package com.ig.sd.spring; public interface BeanFactory { public Object getBean(String name); }
测试代码
beans.xml
<beans> <bean id="userDao" class="com.ig.sd.dao.impl.UserDaoImpl"> </bean> <bean id="userService" class="com.ig.sd.service.UserService"> <!-- 传说中的注入 -->> <property name="userDao" bean="userDao"></property> </bean> </beans>
Test.java
package com.ig.sd.test; import org.junit.Test; import com.ig.sd.model.User; import com.ig.sd.service.UserService; import com.ig.sd.spring.BeanFactory; import com.ig.sd.spring.ClassPathXmlApplicationContext; public class SpringTest { @Test public void test() throws Exception { BeanFactory beans = new ClassPathXmlApplicationContext(); UserService userService = (UserService) beans.getBean("userService"); User user = new User(); userService.addUser(user); } }
User.java
package com.ig.sd.model; 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; } }
UserService.java
package com.ig.sd.service; import com.ig.sd.dao.UserDao; import com.ig.sd.dao.impl.UserDaoImpl; import com.ig.sd.model.User; public class UserService { private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void addUser(User u) { userDao.save(u); } }
UserDao.java
package com.ig.sd.dao; import com.ig.sd.model.User; public interface UserDao { public void save(User u); }
UserDaoImpl.java
package com.ig.sd.dao.impl; import com.ig.sd.dao.UserDao; import com.ig.sd.model.User; public class UserDaoImpl implements UserDao { @Override public void save(User u) { // TODO Auto-generated method stub System.out.println("a user saved"); } }