实现极简容器
第一个, maven依赖
<dependencies>
<!--Dom4j是Java的XML解析组件-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
<!--Jaxen是Xpath表达式解释器-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
</dependencies>
第二个, 新建Apple类
public class Apple{
private String title;
private String color;
private String origin;
...setter getter
}
第三个, 在xml中配置
<beans>
<bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple" >
<property name="title" value="红富士" />
<property name="color" value="红色" />
<property name="origin" value="欧洲" />
</bean>
</beans>
第四个, 新建接口ApplicationContext
public interface ApplicationContext {
public Object getBean(String beanId);
}
第五个, 创建一个类, 继承自ApplicationContext, 分析xml并实例化对象
public class ClassPathXmlApplicationContext implements ApplicationContext {
private Map iocContainer = new HashMap();
public ClassPathXmlApplicationContext() {
try{
String filePath=this.getClass().getResource("/applicationContext.xml");
filePath=new URLDecoder().decode(filePath,"UTF-8");
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filePath));
List<Node> beans = document.getRootElement().selectNodes("bean");
for(Node node : beans){
Element el = (Element) node;
String id=ele.attributeValue("id");
String className=ele.attributeValue("class");
Class.forName(className);
Object obj=c.newInstance();
List<Node> properties = ele.selectNodes("property");
for(Node p : properties){
Element property = (Element) p;
String name = property.attributeValue("name");
String propValue = property.attributeValue("value");
String setMethodName = "set"+propName.substring(0,1).toUpperCase()+propName.substring();
Method setMethod = c.getMethod(setMethodName, String.class);
setMethod.invoke(obj,propValue);
}
iocContainer.put(id,obj);
}
}catch(Exception e){
e.printStackInfos();
}
}
public Object getBean(String beanId){
return iocContainer.get(beanId);
}
}
第六个, 主方法
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext();
Apple apple = (Apple) context.getBean("sweetApple");
System.out.println(apple);
}