简单模拟 Spring 的 ioc

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="userDao" class="com.test.dao.impl.UserDaoImpl" />
	
	<bean id="userService" class="com.test.service.UserService">
		<property name="userDao" bean="userDao" />
	</bean>
</beans>

 

UserDao

package com.test.dao;

import com.test.entity.User;

public interface UserDao {
	public void save(User u);
}

 

UserDaoImpl

package com.test.dao.impl;

import com.test.dao.UserDao;
import com.test.entity.User;

public class UserDaoImpl implements UserDao {

	public void save(User u) {
		System.out.println("save a user !");
	}
}

 

User

package com.test.entity;

public class User {
	private int uid;
	
	private String uname;

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

}

 

UserService

package com.test.service;

import com.test.dao.UserDao;
import com.test.entity.User;

public class UserService {
	private UserDao userDao;
	
	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void save(User u) {
		userDao.save(u);
	}
}

 

BeanFactory

package myspring;

public interface BeanFactory {
	public Object getBean(String bean);
}

 

ClassPathXmlApplicationContext

package myspring;

import java.io.IOException;
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.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ClassPathXmlApplicationContext implements BeanFactory {

	private Map<String, Object> beans = new HashMap<String, Object>();
	
	@SuppressWarnings("unchecked")
	public ClassPathXmlApplicationContext () throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		SAXBuilder sax = new SAXBuilder();
		Document doc = sax.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
		Element element = doc.getRootElement();
		List<Element> list = element.getChildren("bean");
		Element e = null;
		for (int i = 0; i < list.size(); i++) {
			e = list.get(i);
			String id = e.getAttributeValue("id");
			String clazz = e.getAttributeValue("class");
			Object o = Class.forName(clazz).newInstance();
			beans.put(id, o);
			for (Element propElement : (List<Element>)e.getChildren("property")) {
				String name = propElement.getAttributeValue("name");
				String bean = propElement.getAttributeValue("bean");
				System.out.println(name + " " + bean);
				Object beanObject = beans.get(bean);
				String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); 
				System.out.println(methodName);
				Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
				m.invoke(o, beanObject);
			}
		}
	}
	
	
	public Object getBean(String bean) {
		return this.beans.get(bean);
	}

}

 

UserServiceTest(JUnit)

package com.test.service;

import static org.junit.Assert.*;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import myspring.BeanFactory;
import myspring.ClassPathXmlApplicationContext;

import org.jdom.JDOMException;
import org.junit.Test;

import com.test.dao.UserDao;
import com.test.entity.User;

public class UserServiceTest {

	@Test
	public void testSave() {
		BeanFactory cpxac = null;
		try {
			cpxac = new ClassPathXmlApplicationContext();
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		UserService uService = (UserService)cpxac.getBean("userService");
//		UserDao userDao = (UserDao)cpxac.getBean("userDao");
//		uService.setUserdao(userDao);
		User u = new User();
		uService.save(u);
	}

}

 

到此结束

你可能感兴趣的:(spring)