
package com
spring;


import java
io
IOException;

import
URL;

import java
util
ArrayList;

import java
util
HashMap;

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;

import org
jdom
xpath
XPath;


import com
vo
BeanDefinition;



/**

* 簡單模擬spring的ClassPathXmlApplicationContext spring容器管理bean

*

* @author zdw

*

*/

@SuppressWarnings(
unchecked
)

public class MyApplicationContext


{

private List<BeanDefinition> list = new ArrayList<BeanDefinition>();

private Map<String
Object> sigletons = new HashMap<String
Object>();


public MyApplicationContext(String fileName)


{

this
readXML(fileName);

try


{

instanceBeans();

}

catch (Exception e)


{

e
printStackTrace();

}

}



/**

* 實例化所有bean

*

* @throws InstantiationException

* @throws IllegalAccessException

* @throws ClassNotFoundException

*/

private void instanceBeans() throws InstantiationException

IllegalAccessException
ClassNotFoundException


{

for (BeanDefinition bean : list)


{

if (null != bean
getClassName() && bean
getClassName()
length() >
)

sigletons
put(bean
getId()
Class
forName(bean
getClassName())
newInstance());

}

}



/**

* 讀取xml配置

*

* @param fileName

*/

public void readXML(String fileName)


{

SAXBuilder builder = new SAXBuilder();

URL url = this
getClass()
getClassLoader()
getResource(fileName);

try


{

Document doc = builder
build(url);

XPath xpath = XPath
newInstance(
//ns:beans/ns:bean
);

xpath
addNamespace(
ns
);

List<Element> beans = xpath
selectNodes(doc);

for (Element bean : beans)


{

String id = bean
getAttributeValue(
id
);

String className = bean
getAttributeValue(
class
);

BeanDefinition beanDefinition = new BeanDefinition(id

className);

list
add(beanDefinition);

}


}

catch (JDOMException e)


{

e
printStackTrace();

}

catch (IOException e)


{

e
printStackTrace();

}

}



/**

* 得到指定id的bean

*

* @param id

* @return

*/

public Object getBean(String id)


{

return sigletons
get(id);

}

}
測試

@Test

public void testMyUserService()


{

MyApplicationContext ctx = new MyApplicationContext(
beans
xml
);

UserService us = (UserService) ctx
getBean(
userService
);

us
print();

}
代碼下載點擊
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28759.html