Reputation: 61
I have a class MyMessageConsumer which is a spring Component. I have autowired MessageReceiver interface as below :
@Component
@Scope("prototype")
public class MyMessageConsumer {
@Autowired
private MessageReceiver messageReceiver;
}
I want to create multiple bean instances of MyMessageConsumer each with different implementations of MessageReceiver say TextMessageReceiver, XMLMessageReceiver, JSONMessageReceiver.
// If a setter is provided in MyMessageConsumer, then it would be suffiecent. But how to do it without setter.
Is it possible to inject different implementation without a setter method in the above scenario? Otherwise please suggest the best alternative.
Thanks in advance.
Upvotes: 1
Views: 1455
Reputation: 8324
One option is removing the @autowired in the MyMessageConsumer.
@Component
@Scope("prototype")
public class MyMessageConsumer {
private MessageReceiver messageReceiver;
public MessageReceiver getMessageReceiver() {
return messageReceiver;
}
public void setMessageReceiver(MessageReceiver messageReceiver) {
this.messageReceiver = messageReceiver;
}
}
Then define you MessageReceiver beans
@Bean
public TextMessageReceiver textMessageReceiver() {
return new TextMessageReceiver();
}
@Bean
public XMLMessageReceiver xMLMessageReceiver() {
return new XMLMessageReceiver();
}
Then you need to define your MessageConsumers
@Bean
@Autowired
public MyMessageConsumer myMessageConsumer1(TextMessageReceiver textMessageReceiver) {
MyMessageConsumer m = new MyMessageConsumer();
m.setMessageReceiver(textMessageReceiver);
return m;
}
@Bean
@Autowired
public MyMessageConsumer myMessageConsumer2(XMLMessageReceiver xMLMessageReceiver) {
MyMessageConsumer m = new MyMessageConsumer();
m.setMessageReceiver(xMLMessageReceiver);
return m;
}
Upvotes: 1