我要讲的这个例子是基于这样简易Bean工厂类思想,把类及其实现的接口配置到XML中,工厂(其实就是一个Map)基于这个配置文件来存储类的实例,对于Map中的每个元素都是类的一个实例,其中接口作键,利用反射生成相应的对象作值,使用者可以把此Map作为一个容器来取得目标类的实例。
<sys-configure>
<jdbc-info>
<driver-class-name>
oracle.jdbc.driver.OracleDriver
</driver-class-name>
<url>jdbc:oracle:thin:@127.0.0.1:1521:test</url>
<user-name>scott</user-name>
<password>yf123</password>
</jdbc-info>
<beans>
<bean id="com.yangfei.jdom.read.TestDao"
class="com.yangfei.jdom.read.TestDaoImpl">
</bean>
<bean id="com.yangfei.jdom.read.TestService"
class="com.yangfei.jdom.read.TestServiceImpl">
</bean>
<!-- 可以把所有的需要创建的类配置进来 -->
</beans>
</sys-configure>
public interface TestDao {
public void test();
}
public class TestDaoImpl implements TestDao {
public void test() {
System.out.println("print from TestDaoImpl");
}
}
public interface TestService {
public void t();
}
public class TestServiceImpl implements TestService {
public void t() {
System.out.println("print from TestService");
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Map beanMap = new HashMap();// 用来存放从xml文件中取出的id和classname对用的对象
SAXBuilder sb = new SAXBuilder();
Document doc = null;
try {
doc = sb.build(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("configure.xml"));// 以相对目录来读取文件
Element rootElt = doc.getRootElement();
List<Element> Elts = XPath.selectNodes(rootElt,"//sys-configure/beans/bean");
for (Element elt : Elts) {
String id = elt.getAttributeValue("id");
String className = elt.getAttributeValue("class");
System.out.println(id + "@@@" + className);
// 取出之后生成实现类的具体对象,以接口为键,以实现类对象为值存放在Map里
Object obj = Class.forName(className).newInstance();
beanMap.put(id, obj);// 以后使用类对象时就可以访问Map来取得对象了.
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}