Spring 使用 util:list 按类型自动装配
Spring autowire byType with util:list
我正在学习 spring(并在行动中遵循 Spring),因为我在玩弄以了解一些概念;然后我观察到以下行为。
场景:
我想通过使用 "byType" 自动装配选项在 Class 中自动装配列表 属性。所以我创建了 util:list bean;成功注入...所以这里不足为奇:)。
然后我在相同的class(不同的class层次结构:偏离路线)中添加了一个新列表属性;然后在不做任何额外布线的情况下也被注入....:O
任何人都可以解释幕后发生的事情吗?
下面是一些代码片段。
public interface Performer {
public void perform();
}
public interface Instrument {
public void play();
}
public class Show implements Audotorium {
Logger logger = Logger.getLogger(Show.class.getName());
List<Performer> performerList;
List<Instrument> instruments;
public void setPerformerList(List<Performer> performerList) {
this.performerList = performerList;
}
public void setInstruments(List<Instrument> instruments) {
this.instruments = instruments;
}
public void show() {
Iterator<Performer> performerItr = performerList.iterator();
while (performerItr.hasNext()) {
performerItr.next().perform();
}
Iterator<Instrument> instrumentItr = instruments.iterator();
while (instrumentItr.hasNext()) {
instrumentItr.next().play();
}
}
}
主要Class
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring-context.xml");
((Show) context.getBean("show")).show();
}
Bean 配置:
<bean id="juggler" class="com.learning.Juggler"/>
<bean id="magcian" class="com.learning.Magician"/>
<bean id="kenny" class="com.learning.Instrumentalist">
<property name="song" value="bay finger bay finger"/>
<property name="instrument" ref="saxphone"/>
</bean>
<bean id="hunk" class="com.learning.OneManBand" autowire="byType">
<property name="song" value="bay finger bay finger"/>
<property name="instruments">
<list>
<ref bean="saxphone"/>
<ref bean="guitar"/>
<ref bean="harmonica"/>
</list>
</property>
</bean>
<bean id="totalBeanBags" class="java.lang.Integer" factory-method="valueOf">
<constructor-arg value="#{performerList.size()}"/>
</bean>
<bean id="saxphone" class="com.learning.SaxPhone"/>
<bean id="guitar" class="com.learning.GenaricInstument">
<property name="instrumentSound" value="guitar sound"/>
</bean>
<bean id="harmonica" class="com.learning.GenaricInstument">
<property name="instrumentSound" value="harmonica sound"/>
</bean>
<util:list id="performerList"/>
<bean id="show" class="com.learning.Show" autowire="byType">
</bean>
输出:
JUGGLING 10 BEANBAGS
Showing some crazy magicSSsssSSSsss.....
Playing bay finger bay finger : TOO TOO TOO
Playing bay finger bay finger : TOO TOO TOO
guitar sound
harmonica sound
----Now its music time----
TOO TOO TOO
guitar sound
harmonica sound
与
<util:list id="performerList"/>
你创建了一个空列表,它没有被使用,你可以删除它。
您有一个 Performer
类型的 bean 'OneManBand'。
当spring 尝试自动装配setPerformerList
时,它会自动创建类型List<Performer>
的列表并将其用作参数。 Spring 将所有 Performer
类型的 beans 放入该列表。
Instrument
的列表以相同的方式创建和注入。
这是 spring 的一个非常方便的功能,我经常使用它来构建注册表,收集特定类型的所有 bean 并对其进行操作。
我正在学习 spring(并在行动中遵循 Spring),因为我在玩弄以了解一些概念;然后我观察到以下行为。
场景:
我想通过使用 "byType" 自动装配选项在 Class 中自动装配列表 属性。所以我创建了 util:list bean;成功注入...所以这里不足为奇:)。
然后我在相同的class(不同的class层次结构:偏离路线)中添加了一个新列表属性;然后在不做任何额外布线的情况下也被注入....:O
任何人都可以解释幕后发生的事情吗?
下面是一些代码片段。
public interface Performer {
public void perform();
}
public interface Instrument {
public void play();
}
public class Show implements Audotorium {
Logger logger = Logger.getLogger(Show.class.getName());
List<Performer> performerList;
List<Instrument> instruments;
public void setPerformerList(List<Performer> performerList) {
this.performerList = performerList;
}
public void setInstruments(List<Instrument> instruments) {
this.instruments = instruments;
}
public void show() {
Iterator<Performer> performerItr = performerList.iterator();
while (performerItr.hasNext()) {
performerItr.next().perform();
}
Iterator<Instrument> instrumentItr = instruments.iterator();
while (instrumentItr.hasNext()) {
instrumentItr.next().play();
}
}
}
主要Class
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring-context.xml");
((Show) context.getBean("show")).show();
}
Bean 配置:
<bean id="juggler" class="com.learning.Juggler"/>
<bean id="magcian" class="com.learning.Magician"/>
<bean id="kenny" class="com.learning.Instrumentalist">
<property name="song" value="bay finger bay finger"/>
<property name="instrument" ref="saxphone"/>
</bean>
<bean id="hunk" class="com.learning.OneManBand" autowire="byType">
<property name="song" value="bay finger bay finger"/>
<property name="instruments">
<list>
<ref bean="saxphone"/>
<ref bean="guitar"/>
<ref bean="harmonica"/>
</list>
</property>
</bean>
<bean id="totalBeanBags" class="java.lang.Integer" factory-method="valueOf">
<constructor-arg value="#{performerList.size()}"/>
</bean>
<bean id="saxphone" class="com.learning.SaxPhone"/>
<bean id="guitar" class="com.learning.GenaricInstument">
<property name="instrumentSound" value="guitar sound"/>
</bean>
<bean id="harmonica" class="com.learning.GenaricInstument">
<property name="instrumentSound" value="harmonica sound"/>
</bean>
<util:list id="performerList"/>
<bean id="show" class="com.learning.Show" autowire="byType">
</bean>
输出:
JUGGLING 10 BEANBAGS
Showing some crazy magicSSsssSSSsss.....
Playing bay finger bay finger : TOO TOO TOO
Playing bay finger bay finger : TOO TOO TOO
guitar sound
harmonica sound
----Now its music time----
TOO TOO TOO
guitar sound
harmonica sound
与
<util:list id="performerList"/>
你创建了一个空列表,它没有被使用,你可以删除它。
您有一个 Performer
类型的 bean 'OneManBand'。
当spring 尝试自动装配setPerformerList
时,它会自动创建类型List<Performer>
的列表并将其用作参数。 Spring 将所有 Performer
类型的 beans 放入该列表。
Instrument
的列表以相同的方式创建和注入。
这是 spring 的一个非常方便的功能,我经常使用它来构建注册表,收集特定类型的所有 bean 并对其进行操作。