bean配置文件将就spring的:
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="user" class="org.forever.ioc.entities.User"> <property name="username" value="forever"/> <property name="nickNames"> <list> <value>传说</value> <value>神话</value> </list> </property> </bean> </beans>
实体类User:
package org.forever.ioc.entities;
public class User {
private String username;
private String[] nickNames;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String[] getNickNames() {
return nickNames;
}
public void setNickNames(String[] nickNames) {
this.nickNames = nickNames;
}
}
容器类Application:
package org.forever.ioc.context;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.forever.ioc.entities.User;
//容器
public class ApplicationContext {
private String resourceName = "applicationContext.xml";
private Map<String, Object> map = new HashMap<String, Object>();
public ApplicationContext() {
readxml();
}
public ApplicationContext(String resourceName) {
this.resourceName = resourceName;
readxml();
}
private void readxml() {
// 读取配置文件
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(ApplicationContext.class
.getClassLoader().getResourceAsStream(
resourceName));
Element root = document.getRootElement();
for (Object item : root.elements()) {
Element element = (Element) item;
String id = element.attribute("id").getText();
String className = element.attribute("class").getText();
Class clazz = Class.forName(className);
Object instance = clazz.newInstance();
// 注入属性的值
for (Object property_ : element.elements("property")) {
Element elementProperty = (Element) property_;
Attribute attrName = elementProperty.attribute("name");
Attribute attrValue = elementProperty.attribute("value");
// 反射获取这个字段的类型
Field field = clazz.getDeclaredField(attrName.getText());
Type type = field.getGenericType();
String methodName = "set" + attrName.getText().substring(0, 1).toUpperCase()
+ attrName.getText().substring(1);
//获取set方法
Method method = clazz.getDeclaredMethod(methodName,(Class)type);
// 如果该字段是一个数组类型
if (((Class)type).isArray()) {
List<Element> valueList = elementProperty.element("list").elements("value");
String[]args = new String[valueList.size()];
for (int i = 0; i < valueList.size(); i++) {
args[i]=valueList.get(i).getText();
}
method.invoke(instance,new Object[]{args});
} else {
method.invoke(instance, attrValue.getText());
}
}
map.put(id, instance);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Object getBean(String beanName) {
return map.get(beanName);
}
public static void main(String[] args) {
ApplicationContext context = new ApplicationContext();
User user = (User) context.getBean("user");
System.out.println("用户的名字:" + user.getUsername());
System.out.println("用户的昵称:");
for (String nickName : user.getNickNames()) {
System.out.println(nickName);
}
}
}
暂时未实现bean中实体的引用,有空再重构