我有一个类有一个Daemon
类型的对象列表.
class Xyz {
List<Daemon> daemons;
}
Run Code Online (Sandbox Code Playgroud)
我的弹簧配置看起来像这样.
<bean id="xyz" class="package1.Xyz">
<property name="daemons" ref="daemonsList">
</bean>
<bean id="daemon1" class="package1.DaemonImpl1"/>
<bean id="daemon2" class="package1.DaemonImpl2"/>
<bean id="daemonsList" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="daemon1" />
<ref bean="daemon2" />
</list>
</constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)
现在,不是在列表中显式连接每个守护进程实现,而是可以Daemon
在列表中自动自动装配所有类型的bean .我试图解决的问题是,如果有人创建了一个新的Daemon
类实现的bean 并忘记将其连接到列表中.
我在stackoverflow上的某个地方看到过这个问题,但是无法再找到它.为此道歉.
Sea*_*oyd 71
它应该像这样工作(从XML中删除ArrayList bean):
public Class Xyz {
private List<Daemon> daemons;
@Autowired
public void setDaemons(List<Daemon> daemons){
this.daemons = daemons;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为在XML中没有办法做到这一点.
通过将注释添加到需要该类型数组的字段或方法,还可以从ApplicationContext提供特定类型的所有bean:
public class MovieRecommender {
@Autowired
private MovieCatalog[] movieCatalogs;
// ...
}
Run Code Online (Sandbox Code Playgroud)
这同样适用于类型集合:
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
// or if you don't want a setter, annotate the field
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,从Spring 4.x开始,可以使用该@Ordered
机制自动订购这些列表.
小智 5
嗯,这可以通过Spring 文档中所述的两种方式来实现。
以下是文档的摘录。
使用 byType 或构造函数自动装配模式,您可以连接数组和类型化集合。
1. autowire =“按类型”
如果 xml 中定义的 bean 类型与列表类型匹配,则可以使用“byType”实现自动装配。
例子:
电机.java
package com.chiranth;
public interface Motor
{
public void start();
}
Run Code Online (Sandbox Code Playgroud)
ElectricMotor1.java
package com.chiranth;
public class ElectricMotor1 implements Motor
{
public void start()
{
System.out.println("Motor 1 Started.");
}
}
Run Code Online (Sandbox Code Playgroud)
ElectricMotor2.java
package com.chiranth;
public class ElectricMotor2 implements Motor
{
public void start()
{
System.out.println("Motor 2 Started.");
}
}
Run Code Online (Sandbox Code Playgroud)
TeslaModelX.java
package com.chiranth;
import java.util.List;
public class TeslaModelX
{
private List<Motor> motor;
public List<Motor> getMotor()
{
return motor;
}
public void setMotor(List<Motor> motor)
{
this.motor = motor;
}
public void goForward()
{
for(Motor m :motor)
m.start();
System.out.println("Going Forward.");
}
}
Run Code Online (Sandbox Code Playgroud)
Spring.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="electricMotor1" class="com.chiranth.ElectricMotor1"/>
<bean id="electricMotor2" class="com.chiranth.ElectricMotor2"/>
<bean id="modelX" class="com.chiranth.TeslaModelX" autowire="byType"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
测试.java
package com.chiranth;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test
{
public static void main(String[] args)
{
ApplicationContext context= new ClassPathXmlApplicationContext("Spring.xml");
TeslaModelX modelx=(TeslaModelX)context.getBean("modelX");
modelx.goForward();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Motor 1 Started.
Motor 2 Started.
Going Forward.
Run Code Online (Sandbox Code Playgroud)
2. autowire =“构造函数”
如果 xml 中定义的 bean 类型与构造函数中的参数类型匹配,则可以使用“构造函数”实现自动装配。
例子:
考虑上面的 Motor.java 、 ElectricMotor1.java 和 ElectricMotor2.java 。
TeslaModelX.java
package com.chiranth;
import java.util.List;
public class TeslaModelX
{
private List<Motor> motor;
public TeslaModelX(List<Motor> motor)
{
this.motor=motor;
}
public void goForward()
{
for(Motor m:motor)
m.start();
System.out.println("Going Forward.");
}
}
Run Code Online (Sandbox Code Playgroud)
Spring.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="electricMotor1" class="com.chiranth.ElectricMotor1"/>
<bean id="electricMotor2" class="com.chiranth.ElectricMotor2"/>
<bean id="modelX" class="com.chiranth.TeslaModelX" autowire="constructor"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
测试.java
package com.chiranth;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test
{
public static void main(String[] args)
{
ApplicationContext context= new ClassPathXmlApplicationContext("Spring.xml");
TeslaModelX modelX=(TeslaModelX)context.getBean("modelX");
modelX.goForward();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Motor 1 Started.
Motor 2 Started.
Going Forward.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53791 次 |
最近记录: |