简单模拟spring di

spring di(即依赖注入)的原理个人理解是这样子的,先读取配置文件,在通过解析xml将有用的信息扣取出来,再通过反射机制来实现类或方法的实例化。
今天我模拟了两种注入方式一种是注入bean,另一种是注入一个factory.对于工厂模式本人觉得还蛮好用的,只要搭建起了架构感觉管理起来挺容易的。还有bridge模式在开发中也是很便于管理的。所以我在这个小例子里面结合了bridge和factory模式。

下面是代码:
1,UserDao:接口
public interface UserDao {

	public boolean add();
	
}



2,ImplUserDaoMySql:实现UserDao接口的MySql数据库dao层
public class ImplUserDaoMySql implements UserDao {

	@Override
	public boolean add() {
		System.out.println("add MySql Dao!");
		return true;
	}

}


3,ImplUserDaoOracle:实现UserDao接口的Oracle数据库dao层
public class ImplUserDaoOracle implements UserDao {

	@Override
	public boolean add() {
		System.out.println("add Oracle Dao!");
		return true;
	}

}


上面两个就可以体现出桥模式的优点

4,DaoFactory:工厂模式类用于生产各种UserDao
public class DaoFactory {

	public static UserDao getUserDaoOracle(){
		return new ImplUserDaoOracle();
	}
	
	public static UserDao getUserDaoMySql(){
		return new ImplUserDaoMySql();
	}
}


5,AnalogApplicationContext:模拟di主程序
public class AnalogApplicationContext {
	private Map<String, Object> map = new HashMap<String, Object>();

	public AnalogApplicationContext(String configLocation) {
		// 解析配置文件,将信息放入map中
		SAXReader sax = new SAXReader();

		try {
			Document document = sax.read(AnalogApplicationContext.class
					.getResourceAsStream(configLocation));
			Element root = document.getRootElement();
			List<Element> elements = root.elements();
			for (int i = 0; i < elements.size(); i++) {
				Element element = elements.get(i);
				String idDI = element.attribute("id").getData().toString();
				String classDI = element.attribute("class").getData()
						.toString();
				String factoryMethodDI = "";
				if (element.attribute("factory-method") == null) {
					map.put(idDI, Class.forName(classDI).newInstance());
				} else {
					factoryMethodDI = element.attribute("factory-method")
							.getData().toString();
					Object obj = Class.forName(classDI).newInstance()
							.getClass().getDeclaredMethod(factoryMethodDI)
							.invoke(Class.forName(classDI).newInstance());
					map.put(idDI, obj);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Object getBean(String id) {
		return map.get(id);
	}
}


6,applicationContext-di.xml:spring模拟配置文件,注意本模拟程序中applicationContext-di.xml必须和AnalogApplicationContext.java主模拟程序放在同一目录下,应为我获取applicationContext-di.xml文件路径是先通过AnalogApplicationContext.java来获取,当然这个也是可变的,自由发挥喽。
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	
	<bean id="userDaoOracle" class="com.fairy.spring.di.impldao.ImplUserDaoOracle" />	
	<bean id="userDaoMySql" class="com.fairy.spring.di.daofactory.DaoFactory" factory-method="getUserDaoMySql" />
	
</beans>


7,TestDI:测试类,用来测试两种注入方式
public class TestDI {

	/**
	 * @测试模拟spring DI程序
	 */
	public static void main(String[] args) {
		/**
		 * 测试bean注入模式
		 */
		AnalogApplicationContext alAcOracle = new AnalogApplicationContext("applicationContext-di.xml");
		UserDao userdaoOracle = (UserDao)alAcOracle.getBean("userDaoOracle");
		userdaoOracle.add();
		/**
		 * 测试factory注入模式
		 */
		AnalogApplicationContext alAcMySql = new AnalogApplicationContext("applicationContext-di.xml");
		UserDao userdaoMySql = (UserDao)alAcMySql.getBean("userDaoMySql");
		userdaoMySql.add();
	}

}

猜你喜欢

转载自lochen514.iteye.com/blog/1275503