package com.itheima.factory;
/**
* Bean工廠:創(chuàng)建對象
* 步驟:
*? 1. 解析xml,獲取所有對象的全限定類型(全名稱)
*? 2. 反射創(chuàng)建對象,存儲到容器中
*? ? ? 容器:有查找的需求,使用map集合
*? 3. 用戶需要對象時,從容器中根據(jù)id直接獲取
*/
public class BeanFactory {
? ? // String: id , Object : 反射創(chuàng)建好的對象
? ? private static Map<String,Object> map = new HashMap<>();
? ? //靜態(tài)代碼塊:類加載時執(zhí)行,只會執(zhí)行一次
? ? static {
? ? ? ? //解析xml,獲取所有對象的全限定類型(全名稱)
? ? ? ? SAXReader reader = new SAXReader();
? ? ? ? try {
? ? ? ? ? ? //獲取文檔對象
? ? ? ? ? ? Document doc = reader.read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
? ? ? ? ? ? //獲取根節(jié)點
? ? ? ? ? ? Element rootElement = doc.getRootElement();
? ? ? ? ? ? //獲取根節(jié)點下的所有的子節(jié)點
? ? ? ? ? ? List<Element> elements = rootElement.elements();
? ? ? ? ? ? //遍歷
? ? ? ? ? ? for (Element element : elements) {
? ? ? ? ? ? ? ? String idValue = element.attributeValue("id");
? ? ? ? ? ? ? ? String classValue = element.attributeValue("class");
? ? ? ? ? ? ? ? //反射創(chuàng)建對象,存儲到容器中
? ? ? ? ? ? ? ? Class clazz = Class.forName(classValue);
? ? ? ? ? ? ? ? Object obj = clazz.newInstance();
? ? ? ? ? ? ? ? //存儲到容器中
? ? ? ? ? ? ? ? map.put(idValue, obj);
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
//提供調(diào)用方法
? ? public static Object? getBean(String id){
? ? ? ? return map.get(id);
? ? }
}