67,513
社区成员
发帖
与我相关
我的任务
分享
public interface BeanFactory {
public Object getBean(String name);
}
public class XmlBeanFactory implements BeanFactory {
private static XmlBeanFactory xmlBeanFactory;
private Map<String, Object> beans = new HashMap<String, Object>();
private XmlBeanFactory() {
this("beans.xml");
}
public static XmlBeanFactory getInstance() {
if (xmlBeanFactory != null) {
return xmlBeanFactory;
}
xmlBeanFactory = new XmlBeanFactory();
return xmlBeanFactory;
}
public static XmlBeanFactory getInstance(String configurationFile) {
if (xmlBeanFactory != null) {
return xmlBeanFactory;
}
xmlBeanFactory = new XmlBeanFactory(configurationFile);
return xmlBeanFactory;
}
private XmlBeanFactory(String configurationFile) {
try {
SAXReader reader = new SAXReader();
InputStream in = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(configurationFile);
Document document = reader.read(in);
String xPath = "//beans/bean";
List<Node> nodes = document.selectNodes(xPath);
for (Node n : nodes) {
//获取bean节点的id和class,用反射实例化bean,并放到Map里
String name = n.valueOf("@id");
String className = n.valueOf("@class");
Object object = Class.forName(className).newInstance();
this.beans.put(name, object);
List<Node> properties = n.selectNodes("property");
//利用反射实现setter注入依赖
if (properties.size() > 0) {
for (Node property : properties) {
// setter方式注入
String propertyName = property.valueOf("@name");
String propertyValue = property.valueOf("@value");
Object setter = getBean(propertyValue);
//拼凑setXXX方法名
StringBuffer sb = new StringBuffer(propertyName);
sb.replace(0, 1, (propertyName.charAt(0) + "").toUpperCase());
propertyName = "set" + sb.toString();
Method m = object.getClass().getMethod(propertyName,
setter.getClass().getInterfaces());
System.out.println("method name is : " + m.getName());
// 约定:setters方法所决定的属性(property)名,与配置文件中相应的对象命名一致!
m.invoke(object, setter);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object getBean(String name) {
return beans.get(name);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- dao -->
<bean id="articleDao" class="com.fjx.cms.dao.impl.ArticleDaoImpl">
</bean>
<!-- service -->
<bean id="articleService"
class="com.fjx.cms.service.impl.ArticleServiceImpl">
<property name="articleDao" value="articleDao"></property>
</bean>
</beans>