A note hints that other annotations, Resource and Inject, could be used, but no example is provided. I thought it was better to practice a bit on them too.
Autowired
The provided example is actually what we usually see in Spring code:
@Override @Autowired public void setMessageProvider(MessageProvider provider) { this.messageProvider = provider; }We should only be aware that Autowired is pure Spring, as its full name documents.
Inject
We could get the same result using the JSR standard annotation Inject:
@Override @Inject public void setMessageProvider(MessageProvider provider) { this.messageProvider = provider; }I had to change the provided build.gradle file for chapter three, setter-injection project, since it didn't have the compile dependency for injection, named misc.inject and defined in the main build.gradle file as
inject : "javax.inject:javax.inject:1"Autowired and Qualifier
Say that we have more than one Component implementing the MessageProvider interface. The default one is name "provider", and so it is chosen by Spring in the above examples. But what if I want to inject a different one, for instance "pro2":
@Component("pro2") class MessageProvider2 implements MessageProvider { @Override public String getMessage() { return "Hello from Message Provider 2!"; } }The Spring commonly used approach is using the Qualifier annotation.
@Override @Autowired @Qualifier("pro2") public void setMessageProvider(MessageProvider provider) { this.messageProvider = provider; }Both Autowired and Qualifier are Spring specific annotations.
Resource
A JSR standard alternative to the couple Autowired + Qualifier is given by the Resource annotation.
@Override @Resource(name = "pro3") public void setMessageProvider(MessageProvider provider) { this.messageProvider = provider; }Here above, the Component named "pro3" is going to be injected in provider.
Inject and Named
Another JSR standard alternative to Autowired + Qualifier is provided by the couple Inject + Named.
@Override @Inject @Named("pro4") public void setMessageProvider(MessageProvider provider) { this.messageProvider = provider; }I have pushed to GitHub my changes. You could see there the build.gradle file, my new Components, and the alternative setters.