【问题标题】:How do I make sure resources are injected in my configuration before it starts returning beans?如何确保在我的配置开始返回 bean 之前将资源注入到我的配置中?
【发布时间】:2012-06-11 03:20:23
【问题描述】:

我正在尝试定义一个 bean,它是我使用 @Component 注释配置的 bean 列表。我正在使用弹簧 3.1。

我的@Configuration 类看起来像

@Configuration
public class ReferenceDataConfig {
    private ResourceA resourceA;

    @Resource
    private ResourceB resourceB;

    @Resource
    private ResourceC resourceC;

    @Resource
    private ResourceD resourceD;

    @Bean (name = "myResourceList")
    public List<MyResource> getResourceLst() {
        return Arrays.asList(
                resourceA
                , resourceB
                , resourceC
                , resourceD
        );
    }

    @Resource  (name = "resourceA")
    public void setResourceA(ResourceA resourceA) {
        this.resourceA = resourceA;
    }

我发现在初始化任何资源之前调用了 getResourceLst。当我添加 setResourceA 方法时,我可以看到它最终会被调用,但是当它被调用时为时已晚。 myResourceList bean 已经创建。

我应该如何处理这个问题?

谢谢, 彼得

【问题讨论】:

    标签: java spring configuration annotations


    【解决方案1】:

    根据您想要做什么,解决方案可能比您想象的要简单。

    如果List&lt;MyResource&gt; 应该包含MyResource 类型的所有bean,那么您不必为列表声明单独的bean。您可以像注入任何其他 bean 一样注入列表,Spring 将收集它在应用程序上下文中找到的所有 MyResource 类型的 bean,并将它们全部作为 List&lt;MyResource&gt; 对象注入。

    【讨论】:

    • 这在某些时候可能很有用。但是在这种情况下,列表的顺序很重要。
    【解决方案2】:

    我认为 Spring 中可能存在错误。我收集了我应该工作的东西,但是以下解决方法对我有用:

    @Configuration
    public class ReferenceDataConfig {
        @Bean (name = "myResourceList")
        public List<MyResource> getResourceLst(ResourceA resourceA, ResourceB resourceB, ResourceC resourceC, ResourceD resourceD) {
            return Arrays.asList(
                    resourceA
                    , resourceB
                    , resourceC
                    , resourceD
            );
        }
    

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多