Siva Narayana Reddy M
Siva Narayana Reddy M

Reputation: 61

Spring Component dependency injection of a field with multiple implementations

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

Answers (1)

reos
reos

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

Related Questions