根据类型

时间:2018-02-09 09:29:34

标签: java spring

我正在寻找这个,因为查看时间,但找不到任何与我的问题直接匹配的内容:

在我的应用程序中,我希望将不同的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。

0 个答案:

没有答案