我正在寻找这个,因为查看时间,但找不到任何与我的问题直接匹配的内容:
在我的应用程序中,我希望将不同的bean(不同的工作类)存储在组件列表中。后来我想迭代这个列表并调用一个执行方法(相同的命名但行为不同)
到目前为止,对我来说不是问题,我创建了Interface IInterface并使用@Autowired Annotation来注入实现接口的所有bean的列表。
接口:
public interface IInterface
{
public void work();
}
Implementation1:
@Component("impl1")
public class Impl1 implements IInterface
{
@Override
public void work()
{
//do fancy stuff
}
}
Implementation2:
@Component("impl2")
public class Impl2 implements IInterface
{
@Override
public void work()
{
//do other fancy stuff
}
}
安排课程
@Component
public class Scheduler
{
@Autowired
private List<IInterface> impls;
@Scheduled(cron = "${scheduling.job.cron}")
public void triggeredWork()
{
for (IInterface impl : impls)
{
impl.work();
}
}
}
在此之前我对实现没有任何问题,但是所描述的设置仅适用于一个环境,现在我必须使用另一个实现类(例如impl3)并且没有impl1来设置另一个环境。 一种方法是混合基于注释的配置和xml配置,为此我必须为每个环境定义一个新的Beans.xml并以这种方式使用它,例如environment1(我不确定这是不对的):
<bean id="scheduler"
class="com.example.Scheduler">
<property name="impls" ref="implList">
</bean>
< bean id="implList" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="impl1" />
<ref bean="impl2" />
</list>
</constructor-arg>
</bean>
但是因为我为每个环境设置了application.properties,我想使用它来存储一个worker类列表,具体取决于环境中需要哪个worker类。但我没有找到一种方法将名称列表绑定到类Scheduler中的List impls。 有弹簧的方法吗?我的同事提到春天不建议在Beans上使用经典的工厂模式。 如果没有它,我不想使用Spring Profiles。