【发布时间】:2013-09-04 20:33:14
【问题描述】:
我正在阅读“Spring Recipes”一书,并尝试通过示例来研究 Spring 的“魔力”。这就是我所拥有的。 Bean 类SequenceGenerator:
public class SequenceGenerator {
private List<Object> suffixes;
//.....
public void setSuffixes(List<Object> suffixes) {
this.suffixes = suffixes;
}
public synchronized String getSequence() {
StringBuffer buffer = new StringBuffer();
for (Object suffix : suffixes) {
buffer.append(suffix);
buffer.append("-");
}
return buffer.toString();
}
}
主类:
public class Main {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
SequenceGenerator generator =
(SequenceGenerator) context.getBean("sequenceGeneratorSet");
System.out.println(generator.getSequence());
}
}
Xml 配置:
<bean id="sequenceGeneratorSet" class="com.apress.springrecipes.sequence.SequenceGenerator">
<property name="initial" value="100000"/>
<property name="suffixes">
<set>
<value>A</value>
<value>A</value>
<bean class="java.net.URL">
<constructor-arg value="http" />
<constructor-arg value="www.apress.com" />
<constructor-arg value="/" />
</bean>
</set>
</property>
</bean>
在 xml 中,我有意使用标签来查看结果。我也写了两次相同的值“A”。我注意到 Spring 为“后缀”属性注入了 ArrayList,作为 bean 类中的类型定义。但它的行为类似于输出设置,仅包含一个“A”值。有人知道 Spring 是如何在内部解决这个问题的吗?
【问题讨论】:
-
可能首先使用您设置的对象创建一个
Set<Object>,然后使用其值基于此集合的列表设置suffixes变量,代码为suffixes = new ArrayList<Object>(theSet);。 -
@LuiggiMendoza 比这要长一点,但你的想法是对的。
-
@SotiriosDelimanolis 是的,我想这背后一定有更多的逻辑,因为它正在解析 XML 文件并可能使用反射创建数据,但我真的不喜欢详细介绍案例,只要理解主要思想:)。
-
@LuiggiMendoza 我最近通过调试器和源代码回答了其中一些深入的问题,这真的很有启发性。花了大约 25 分钟,但我认为这是值得的:P。
-
@SotiriosDelimanolis 顺便说一句,我认为应该重新设计 Spring 代码以停止使用过多的
if-else并使用Map或enum来增强当前的设计。