Skip to content

Commit 5bb19ae

Browse files
committed
xml reader
1 parent 1e10421 commit 5bb19ae

8 files changed

Lines changed: 170 additions & 24 deletions

File tree

changelog.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,8 @@ tiny-IoC
1515
1. 抽象beanfactory
1616
2. 将bean初始化放入beanfactory
1717

18-
## 2.step3-为bean注入属性
19-
*step-3-inject-bean-with-property*
18+
## 3.step3-为bean注入属性
19+
*step-3-inject-bean-with-property*
20+
21+
## 4.step4-读取xml配置来初始化bean
22+
*step-4-config-beanfactory-with-xml*
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package us.codecraft.tinyioc;
2+
3+
import us.codecraft.tinyioc.io.ResourceLoader;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
/**
9+
* 从配置中读取BeanDefinitionReader
10+
*
11+
* @author yihua.huang@dianping.com
12+
*/
13+
public abstract class AbstractBeanDefinitionReader implements BeanDefinitionReader {
14+
15+
private Map<String,BeanDefinition> registry;
16+
17+
private ResourceLoader resourceLoader;
18+
19+
protected AbstractBeanDefinitionReader(ResourceLoader resourceLoader) {
20+
this.registry = new HashMap<String, BeanDefinition>();
21+
this.resourceLoader = resourceLoader;
22+
}
23+
24+
public Map<String, BeanDefinition> getRegistry() {
25+
return registry;
26+
}
27+
28+
public ResourceLoader getResourceLoader() {
29+
return resourceLoader;
30+
}
31+
}

src/main/java/us/codecraft/tinyioc/BeanDefinition.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
/**
44
* bean的内容及元数据,保存在BeanFactory中,包装bean的实体
5+
*
56
* @author yihua.huang@dianping.com
67
*/
78
public class BeanDefinition {
@@ -12,7 +13,7 @@ public class BeanDefinition {
1213

1314
private String beanClassName;
1415

15-
private PropertyValues propertyValues;
16+
private PropertyValues propertyValues = new PropertyValues();
1617

1718
public BeanDefinition() {
1819
}
@@ -46,11 +47,11 @@ public Object getBean() {
4647
return bean;
4748
}
4849

49-
public PropertyValues getPropertyValues() {
50-
return propertyValues;
51-
}
50+
public PropertyValues getPropertyValues() {
51+
return propertyValues;
52+
}
5253

53-
public void setPropertyValues(PropertyValues propertyValues) {
54-
this.propertyValues = propertyValues;
55-
}
54+
public void setPropertyValues(PropertyValues propertyValues) {
55+
this.propertyValues = propertyValues;
56+
}
5657
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package us.codecraft.tinyioc;
2+
3+
/**
4+
* 从配置中读取BeanDefinitionReader
5+
* @author yihua.huang@dianping.com
6+
*/
7+
public interface BeanDefinitionReader {
8+
9+
void loadBeanDefinitions(String location) throws Exception;
10+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package us.codecraft.tinyioc.xml;
2+
3+
import org.w3c.dom.Document;
4+
import org.w3c.dom.Element;
5+
import org.w3c.dom.Node;
6+
import org.w3c.dom.NodeList;
7+
import us.codecraft.tinyioc.AbstractBeanDefinitionReader;
8+
import us.codecraft.tinyioc.BeanDefinition;
9+
import us.codecraft.tinyioc.PropertyValue;
10+
import us.codecraft.tinyioc.io.ResourceLoader;
11+
12+
import javax.xml.parsers.DocumentBuilder;
13+
import javax.xml.parsers.DocumentBuilderFactory;
14+
import java.io.InputStream;
15+
16+
/**
17+
* @author yihua.huang@dianping.com
18+
*/
19+
public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
20+
21+
public XmlBeanDefinitionReader(ResourceLoader resourceLoader) {
22+
super(resourceLoader);
23+
}
24+
25+
@Override
26+
public void loadBeanDefinitions(String location) throws Exception {
27+
InputStream inputStream = getResourceLoader().getResource(location).getInputStream();
28+
doLoadBeanDefinitions(inputStream);
29+
}
30+
31+
protected void doLoadBeanDefinitions(InputStream inputStream) throws Exception {
32+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
33+
DocumentBuilder docBuilder = factory.newDocumentBuilder();
34+
Document doc = docBuilder.parse(inputStream);
35+
// 解析bean
36+
registerBeanDefinitions(doc);
37+
inputStream.close();
38+
}
39+
40+
public void registerBeanDefinitions(Document doc) {
41+
Element root = doc.getDocumentElement();
42+
43+
parseBeanDefinitions(root);
44+
}
45+
46+
protected void parseBeanDefinitions(Element root) {
47+
NodeList nl = root.getChildNodes();
48+
for (int i = 0; i < nl.getLength(); i++) {
49+
Node node = nl.item(i);
50+
if (node instanceof Element) {
51+
Element ele = (Element) node;
52+
processBeanDefinition(ele);
53+
}
54+
}
55+
}
56+
57+
protected void processBeanDefinition(Element ele) {
58+
String name = ele.getAttribute("name");
59+
String className = ele.getAttribute("class");
60+
BeanDefinition beanDefinition = new BeanDefinition();
61+
processProperty(ele,beanDefinition);
62+
beanDefinition.setBeanClassName(className);
63+
getRegistry().put(name, beanDefinition);
64+
}
65+
66+
private void processProperty(Element ele,BeanDefinition beanDefinition) {
67+
NodeList propertyNode = ele.getElementsByTagName("property");
68+
for (int i = 0; i < propertyNode.getLength(); i++) {
69+
Node node = propertyNode.item(i);
70+
if (node instanceof Element) {
71+
Element propertyEle = (Element) node;
72+
String name = propertyEle.getAttribute("name");
73+
String value = propertyEle.getAttribute("value");
74+
beanDefinition.getPropertyValues().addPropertyValue(new PropertyValue(name,value));
75+
}
76+
}
77+
}
78+
}

src/test/java/us/codecraft/tinyioc/BeanFactoryTest.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import org.junit.Test;
44
import us.codecraft.tinyioc.factory.AutowireCapableBeanFactory;
55
import us.codecraft.tinyioc.factory.BeanFactory;
6+
import us.codecraft.tinyioc.io.ResourceLoader;
7+
import us.codecraft.tinyioc.xml.XmlBeanDefinitionReader;
8+
9+
import java.util.Map;
610

711
/**
812
* @author yihua.huang@dianping.com
@@ -11,22 +15,17 @@ public class BeanFactoryTest {
1115

1216
@Test
1317
public void test() throws Exception {
14-
// 1.初始化beanfactory
15-
BeanFactory beanFactory = new AutowireCapableBeanFactory();
16-
17-
// 2.bean定义
18-
BeanDefinition beanDefinition = new BeanDefinition();
19-
beanDefinition.setBeanClassName("us.codecraft.tinyioc.HelloWorldService");
18+
// 1.读取配置
19+
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());
20+
xmlBeanDefinitionReader.loadBeanDefinitions("tinyioc.xml");
2021

21-
// 3.设置属性
22-
PropertyValues propertyValues = new PropertyValues();
23-
propertyValues.addPropertyValue(new PropertyValue("text", "Hello World!"));
24-
beanDefinition.setPropertyValues(propertyValues);
25-
26-
// 4.生成bean
27-
beanFactory.registerBeanDefinition("helloWorldService", beanDefinition);
22+
// 2.初始化BeanFactory并注册bean
23+
BeanFactory beanFactory = new AutowireCapableBeanFactory();
24+
for (Map.Entry<String, BeanDefinition> beanDefinitionEntry : xmlBeanDefinitionReader.getRegistry().entrySet()) {
25+
beanFactory.registerBeanDefinition(beanDefinitionEntry.getKey(), beanDefinitionEntry.getValue());
26+
}
2827

29-
// 5.获取bean
28+
// 3.获取bean
3029
HelloWorldService helloWorldService = (HelloWorldService) beanFactory.getBean("helloWorldService");
3130
helloWorldService.helloWorld();
3231

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package us.codecraft.tinyioc.xml;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
import us.codecraft.tinyioc.BeanDefinition;
6+
import us.codecraft.tinyioc.io.ResourceLoader;
7+
8+
import java.util.Map;
9+
10+
/**
11+
* @author yihua.huang@dianping.com
12+
*/
13+
public class XmlBeanDefinitionReaderTest {
14+
15+
@Test
16+
public void test() throws Exception {
17+
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());
18+
xmlBeanDefinitionReader.loadBeanDefinitions("tinyioc.xml");
19+
Map<String, BeanDefinition> registry = xmlBeanDefinitionReader.getRegistry();
20+
Assert.assertTrue(registry.size() > 0);
21+
}
22+
}

src/test/resources/tinyioc.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
99
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
1010

11-
<bean name="helloWorldService" class="us.codecraft.tinyioc.HelloWorldService"></bean>
11+
<bean name="helloWorldService" class="us.codecraft.tinyioc.HelloWorldService">
12+
<property name="text" value="Hello World!"></property>
13+
</bean>
1214

1315
</beans>

0 commit comments

Comments
 (0)