【问题标题】:Inject values in list property dynamically in spring在春季动态注入列表属性中的值
【发布时间】:2011-11-13 00:56:22
【问题描述】:

在春天,我想动态地在列表属性中注入值。有可能吗?

例如除了指定值 1 三次之外,是否存在某些属性可以根据某个值多次重复此值。

<bean id='myBean' class-"com.foo.Xyz">
 <property name="myList">
    <value>1</value>
    <value>1</value>
    <value>1</value>
 </property>
</bean>

如果问题不清楚,请告诉我。

【问题讨论】:

  • 我猜这对于 SpEL 来说可能是可能的,但它看起来像一个奇怪的要求
  • 如果可以的话,我认为这将是一个坏主意。听起来您会将应用程序的一些逻辑放入 Spring 配置中 - 但它应该只真正处理将应用程序的组件连接在一起。
  • 其实我有一个实现Runnable的类C。它有自己的依赖项所以我使用 spring 来获取这个类的完全构造的实例。现在我想在线程池中安排“X”个这样的线程(java.util.concurrent.ScheduledThreadPoolExecutor )。现在,我在 for 循环 X 次中使用 appContext.getBean('c') 并对其进行调度,但它需要访问应用程序上下文,我读到这不是一个好习惯。
  • 所以我在想,如果我可以从 spring 本身获得此类实例的列表。想不出任何其他方法。

标签: java spring


【解决方案1】:

自定义FactoryBean呢?

public class RepeatingListFactoryBean implements FactoryBean<Object> {

    private final Object item;
    private final int count;

    public RepeatingListFactoryBean(Object item, int count) {
        this.item = item;
        this.count = count;
    }

    @Override
    public Object getObject() throws Exception
    {
        final ArrayList<Object> list = new ArrayList<Object>(count);
        for(int i = 0; i < count; ++i)
            list.add(item);
        return list;
    }

    @Override
    public Class<?> getObjectType() {
        return item.getClass();
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

你可以通过以下方式使用它(不过我没有测试过):

<bean id="listFactory" class="RepeatingListFactoryBean">
  <constructor-arg value="1"/>  <!-- item -->
  <constructor-arg value="3"/>  <!-- count -->
</bean>

<bean id="myBean" class-"com.foo.Xyz">
  <property name="myList" ref="listFactory"/>
</bean>

请注意,计数和要重复的对象都是声明式可配置的。

【讨论】:

  • 感谢 Tomasz,但不会在列表中多次添加相同的 item 引用相同的实例吗?我想要此列表中项目类的不同实例。
  • 您提到您知道getBean() 是如何工作的——只需将BeanFactory 注入RepeatingListFactoryBean 并将beanName 而不是具体的bean 传递给构造函数。最后 - 在每次迭代时调用 getBean() 就完成了。
  • 谢谢。为此,如果我是对的,我必须让它实现BeanFactoryAware。但它比实现ApplicationContextAware 更好吗?
  • 是的,使用BeanFactoryAware - 您需要的最小接口。这使您的代码更加健壮和灵活。
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2020-03-16
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多