模拟Spring的兑现

模拟Spring的实现

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");
	}

}