当前位置: 首页 > 知识库问答 >
问题:

在bean配置方法上使用@Profile注释时,无法注入同一接口的两个字段

裴令秋
2023-03-14

我使用Spring 5.1.4。RELEASE,在bean配置方法上使用@Profile注释时,无法通过构造函数注入相同接口的两个字段。我有一个简单的Publisher组件,如下所示:

@Component
public class Publisher {

    private final MyClient prodClient;
    private final MyClient testClient;

    @java.beans.ConstructorProperties({"prodClient", "testClient"})
    public Publisher(MyClient prodClient, MyClient testClient) {
        this.prodClient = prodClient;
        this.testClient = testClient;
    }

}

当我使用@Profile注释标记整个配置时,它会按预期工作:

@Profile(Profiles.MY_CLIENT)
@Configuration
public class ClientConfig {

    @Bean
    public MyClient prodClient() {
        return new HttpClient("prod.client.channel");
    }

    @Bean
    public MyClient testClient() {
        return new HttpClient("test.client.channel");
    }
}

上面的配置是可以的,但是当我只想在配置类中的某些方法上使用@Profile注释时就会出现问题:

@Configuration
public class ClientConfig {

    @Profile(Profiles.MY_CLIENT)
    @Bean
    public MyClient prodClient() {
        return new HttpClient();
    }

    @Profile(Profiles.MY_CLIENT)
    @Bean
    public MyClient testClient() {
        return new HttpClient();
    }

    // some other beans...
}

然后我在启动过程中出错:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.test.Publisher required a bean of type 'com.test.MyClient' that could not be found.

更新:已经解决了。这是我的错误。我有另外两个bean方法用不同的@Profile注释用于集成测试,但是它们对生产代码具有相同的名称(用Profile注释。MY_CLIENT配置文件):

@Configuration
public class ClientConfig {

    @Profile(Profiles.MY_CLIENT)
    @Bean
    public MyClient prodClient() {
        return new HttpClient();
    }

    @Profile(Profiles.MY_CLIENT)
    @Bean
    public MyClient testClient() {
        return new HttpClient();
    }

    // ... other beans

    @Profile(Profiles.MOCK_MY_CLIENT)
    @Bean
    public MyClient prodClient() {
        return new MockClient();
    }

    @Profile(Profiles.MOCK_MY_CLIENT)
    @Bean
    public MyClient testClient() {
        return new MockClient();
    }
}

共有2个答案

羊舌勇
2023-03-14

在此代码中:

@java.beans.ConstructorProperties({"prodClient", "testClient"})
public Publisher(MyClient prodClient, MyClient testClient) {
    this.prodClient = prodClient;
    this.testClient = testClient;
}

尝试在参数上使用@Autowired注释:

public Publisher(@Autowired MyClient prodClient, @Autowired MyClient testClient) {
    this.prodClient = prodClient;
    this.testClient = testClient;
}
酆光熙
2023-03-14

嗯,如果你尝试注入这个组件的列表?类似于

public Publisher(List<MyClient> clients) {

}

在客户端实现中,您设置了一个标志,该标志可能有助于了解何时应该使用它。

 类似资料:
  • 问题内容: 有人可以给MWE 直接在方法上使用注释的方法吗? 我已经看到了无数的关于在类定义中使用它的示例-但还没有方法的示例。 引用文档: 这种添加到一个类定义或 一个方法 @Target(value = {TYPE, METHOD }) 因此,我认为还有一种可能性和预期的用途-但不幸的是,我无法弄清楚。 问题答案: 这里的DataSource类具有属性url,用户名,密码,driverClas

  • 我很好奇spring注入是如何用注释处理调用方法的。如果我将注释放在一个方法上,并返回一个实例,我理解这会告诉spring通过调用该方法并获得返回的实例来创建一个bean。但是,有时该bean必须用于连接其他bean或设置其他代码。通常的方法是调用带注释的方法来获得一个实例。我的问题是,为什么这不会导致bean的多个实例浮动? 例如,参见下面的代码(摘自另一个问题)。方法是用注释的,因此我想spr

  • 问题内容: 我的测试课: 我在行上得到一个空指针异常: 在精确的给出空指针异常 如何使Junit类中的beanObject字段自动装配成为可能,以便可以使用“ BeanClass”类中的方法? 从评论中复制: 用简单的术语来说.. beanClass是具有某些方法的接口..我用 注释标记了该beanClass。.banClass 是由具有方法实现的beanClassImpl类实现的。.我需要在我的

  • 我有两个spring bean类实现相同的接口。 你能给我一个建议吗。

  • 问题内容: 我很好奇弹簧注入如何处理带有注释的调用方法。如果我在方法上添加注释并返回实例,则我理解这告诉spring通过调用方法并获取返回的实例来创建bean。但是,有时必须使用该bean来连接其他bean或设置其他代码。完成此操作的通常方法是调用带注释的方法以获取实例。我的问题是,为什么这不会导致有多个bean实例漂浮? 例如,请参见下面的代码(取自另一个问题)。该方法带有注释,因此我可以想象s

  • 无法用[class java.lang.String]注入@test注释方法[launchB]. 下面是代码: