Skip to content

Commit 3f0f195

Browse files
authored
Merge pull request #1149 from zhangweidavid/master
Avoid unnecessary object creation when parsing XML tags.
2 parents 6688159 + 284379d commit 3f0f195

File tree

3 files changed

+65
-16
lines changed

3 files changed

+65
-16
lines changed

src/main/java/org/apache/ibatis/reflection/factory/DefaultObjectFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public void setProperties(Properties properties) {
5555
// no props for default
5656
}
5757

58-
<T> T instantiateClass(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
58+
private <T> T instantiateClass(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
5959
try {
6060
Constructor<T> constructor;
6161
if (constructorArgTypes == null || constructorArgs == null) {

src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class XMLScriptBuilder extends BaseBuilder {
3737
private final XNode context;
3838
private boolean isDynamic;
3939
private final Class<?> parameterType;
40+
private final Map<String, NodeHandler> nodeHandlerMap = new HashMap<String, NodeHandler>();
4041

4142
public XMLScriptBuilder(Configuration configuration, XNode context) {
4243
this(configuration, context, null);
@@ -46,6 +47,20 @@ public XMLScriptBuilder(Configuration configuration, XNode context, Class<?> par
4647
super(configuration);
4748
this.context = context;
4849
this.parameterType = parameterType;
50+
initNodeHandlerMap();
51+
}
52+
53+
54+
private void initNodeHandlerMap(){
55+
nodeHandlerMap.put("trim", new TrimHandler());
56+
nodeHandlerMap.put("where", new WhereHandler());
57+
nodeHandlerMap.put("set", new SetHandler());
58+
nodeHandlerMap.put("foreach", new ForEachHandler());
59+
nodeHandlerMap.put("if", new IfHandler());
60+
nodeHandlerMap.put("choose", new ChooseHandler());
61+
nodeHandlerMap.put("when", new IfHandler());
62+
nodeHandlerMap.put("otherwise", new OtherwiseHandler());
63+
nodeHandlerMap.put("bind", new BindHandler());
4964
}
5065

5166
public SqlSource parseScriptNode() {
@@ -88,17 +103,7 @@ List<SqlNode> parseDynamicTags(XNode node) {
88103
}
89104

90105
NodeHandler nodeHandlers(String nodeName) {
91-
Map<String, NodeHandler> map = new HashMap<String, NodeHandler>();
92-
map.put("trim", new TrimHandler());
93-
map.put("where", new WhereHandler());
94-
map.put("set", new SetHandler());
95-
map.put("foreach", new ForEachHandler());
96-
map.put("if", new IfHandler());
97-
map.put("choose", new ChooseHandler());
98-
map.put("when", new IfHandler());
99-
map.put("otherwise", new OtherwiseHandler());
100-
map.put("bind", new BindHandler());
101-
return map.get(nodeName);
106+
return nodeHandlerMap.get(nodeName);
102107
}
103108

104109
private interface NodeHandler {

src/test/java/org/apache/ibatis/reflection/factory/DefaultObjectFactoryTest.java

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,17 @@
1515
*/
1616
package org.apache.ibatis.reflection.factory;
1717

18+
import java.util.ArrayList;
1819
import java.util.Arrays;
20+
import java.util.Collection;
1921
import java.util.Collections;
22+
import java.util.HashMap;
23+
import java.util.HashSet;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.Set;
27+
import java.util.SortedSet;
28+
import java.util.TreeSet;
2029

2130
import org.apache.ibatis.reflection.ReflectionException;
2231
import org.junit.Assert;
@@ -30,20 +39,20 @@
3039
public class DefaultObjectFactoryTest {
3140

3241
@Test
33-
public void instantiateClass() throws Exception {
42+
public void createClass() throws Exception {
3443
DefaultObjectFactory defaultObjectFactory = new DefaultObjectFactory();
35-
TestClass testClass = defaultObjectFactory.instantiateClass(TestClass.class,
44+
TestClass testClass = defaultObjectFactory.create(TestClass.class,
3645
Arrays.<Class<?>>asList(String.class, Integer.class), Arrays.<Object>asList("foo", 0));
3746

3847
Assert.assertEquals("myInteger didn't match expected", (Integer) 0, testClass.myInteger);
3948
Assert.assertEquals("myString didn't match expected", "foo", testClass.myString);
4049
}
4150

4251
@Test
43-
public void instantiateClassThrowsProperErrorMsg() {
52+
public void createClassThrowsProperErrorMsg() {
4453
DefaultObjectFactory defaultObjectFactory = new DefaultObjectFactory();
4554
try {
46-
defaultObjectFactory.instantiateClass(TestClass.class, Collections.<Class<?>>singletonList(String.class), Collections.<Object>singletonList("foo"));
55+
defaultObjectFactory.create(TestClass.class, Collections.<Class<?>>singletonList(String.class), Collections.<Object>singletonList("foo"));
4756
Assert.fail("Should have thrown ReflectionException");
4857
} catch (Exception e) {
4958
Assert.assertTrue("Should be ReflectionException", e instanceof ReflectionException);
@@ -52,4 +61,39 @@ public void instantiateClassThrowsProperErrorMsg() {
5261
}
5362
}
5463

64+
@Test
65+
public void creatHashMap() throws Exception{
66+
DefaultObjectFactory defaultObjectFactory=new DefaultObjectFactory();
67+
Map map= defaultObjectFactory.create(Map.class,null,null);
68+
Assert.assertTrue("Should be HashMap",map instanceof HashMap);
69+
}
70+
71+
@Test
72+
public void createArrayList() throws Exception {
73+
DefaultObjectFactory defaultObjectFactory = new DefaultObjectFactory();
74+
List list = defaultObjectFactory.create(List.class);
75+
Assert.assertTrue(" list should be ArrayList", list instanceof ArrayList);
76+
77+
Collection collection = defaultObjectFactory.create(Collection.class);
78+
Assert.assertTrue(" collection should be ArrayList", collection instanceof ArrayList);
79+
80+
Iterable iterable = defaultObjectFactory.create(Iterable.class);
81+
Assert.assertTrue(" iterable should be ArrayList", iterable instanceof ArrayList);
82+
}
83+
84+
85+
@Test
86+
public void createTreeSet() throws Exception {
87+
DefaultObjectFactory defaultObjectFactory = new DefaultObjectFactory();
88+
SortedSet sortedSet = defaultObjectFactory.create(SortedSet.class);
89+
Assert.assertTrue(" sortedSet should be TreeSet", sortedSet instanceof TreeSet);
90+
}
91+
92+
93+
@Test
94+
public void createHashSet() throws Exception {
95+
DefaultObjectFactory defaultObjectFactory = new DefaultObjectFactory();
96+
Set set = defaultObjectFactory.create(Set.class);
97+
Assert.assertTrue(" set should be HashSet", set instanceof HashSet);
98+
}
5599
}

0 commit comments

Comments
 (0)