自定義框架(三)—— IOC 框架

一、自定義 IOC 框架示例

1、Java 代碼

(1)UserBean 類

public class UserBean {
	//定義容器保存框架創建的所有對象
	private static Map<String,Object> container = new HashMap<String,Object>();
	
	static {
		//使用dom4j解析xml文件讀取bean標籤,將對象創建出來用id爲鍵,對象爲值保存到容器中
		SAXReader reader = new SAXReader();
		try {
			//讀取xml文件
			Document document = reader.read("src/spring1.xml");
			//獲取根便籤
			Element rootElement = document.getRootElement();
			//讀取bean標籤,得到對應對象集合
			List<Element> beans = rootElement.elements("bean");
			
			//獲取bean標籤中的id作爲鍵,class對象值,並保存到容器中
			for(Element b: beans) {
				//獲取id鍵
				String key = b.attributeValue("id");
				//獲取class值
				String value = b.attributeValue("class");
				//存入容器中
				container.put(key, Class.forName(value).newInstance());
			}
			
			//根據property標籤定義的依賴關係完成依賴注入
			for(Element b: beans) {
				//獲取bean下的property標籤
				List<Element> properties = b.elements("property");
				for(Element p: properties) {
					//需要被賦值的屬性名稱
					String pName = p.attributeValue("name");
					//該屬性需要賦值的對象在容器裏的id
					String pRef = p.attributeValue("ref");
					//從容器中拿到被依賴的對象
					Object refObject = container.get(pRef);
					
					//根據屬性名稱獲取set方法
					//根據bean標籤拿到正在循環的這個bean標籤的id
					String key = b.attributeValue("id");
					//從容器中取出依賴方對象
					Object object = container.get(key);
					//獲取依賴方的字節碼信息
					Class c = object.getClass();
					//獲取需要被賦值的屬性對象
					Field field = c.getDeclaredField(pName);
					//獲取該屬性的set方法
					Method method=c.getDeclaredMethod("set"+pName.substring(0, 1).toUpperCase()+pName.substring(1), field.getType());
					//調用方法將被依賴對象賦值給依賴對象的目標屬性
					method.invoke(object, refObject);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public Object getBean(String id) {
		return container.get(id);
	}
}

(2)Service 層 UserService 類

public class UserService {
	private UserDao userDao;
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void insert() {
		System.out.println("執行新增業務");
		userDao.insert();
	}
}

(3)Dao 層 UserDao 類

public class UserDao {
	public void insert() {
		System.out.println("執行新增數據");
	}
}

(4)Action 層 UserAction類

public class UserAction{
	public static void main(String[] args) {
		UserBean factory = new UserBean();
		UserService service = (UserService) factory.getBean("service");
		service.insert();
	}
}

2、配置文件

(1)Spring.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="service" class="com.spring.demo1.service.UserService">
        <property name="userDao" ref="dao"></property>
    </bean>
    <bean id="dao" class="com.spring.demo1.dao.UserDao"></bean>
</beans>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章