我使用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();
}
}
在此代码中:
@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;
}
嗯,如果你尝试注入这个组件的列表?类似于
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]. 下面是代码: