自动装配子类,但使用父类作为参考

时间:2019-06-05 14:39:30

标签: java spring

说我有下面的类层次结构:

// Not a component
public class Parent {
}

// See update; this resides in another application context
@Component
public class Child extends Parent {
}

我想使用构造函数注入自动装配Child bean。

@Component
public class Test {

    private final Parent parent;

    public Test(@Qualifier("child") Parent parent) {
        this.parent = parent;
    }
}

但是Spring不允许我这样做,并且抛出一个异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.foo.Parent' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=child)}

有没有办法使这项工作成功?

更新

好的,首先,由于我犯了一个错误并且在提出问题之前没有正确分析情况,所以您不可能为这个问题提供答案。

所以发生的事情是,在我的情况下,“子代”驻留在不同的应用程序上下文中,而该上下文恰好是主应用程序上下文中的bean。由于这个原因,原本是标准的Spring实践,对我来说是行不通的。

我将发布答案作为此更新方案的解决方案。

2 个答案:

答案 0 :(得分:1)

当您尝试从任何外部库自动装配某些类时,我认为您是在模仿情况。您必须通过xml或java config获取bean。我认为这应该可行,并且您应该从Child中删除组件。

但是无论如何,应该有很大的理由这样做。简单的春季导师接线更加简洁和传统

package com.bssys.ufap.report.springconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
  @Bean
  public Parent getChild() {
    return new Child();
  }
}

答案 1 :(得分:0)

因此,该解决方案仅涉及从其他应用程序上下文中查找bean,如下所示:

@Component
public class Test {

    private final Parent parent;

    public Test(ApplicationContext applicationContext) {
        this.parent = applicationContext.getBean("anotherContext", ApplicationContext.class).getBean("child", Parent.class);
    }
}