Let’s say I have an interface called SocialNetworkService, and three implementations – TwitterService, FacebookService and FriendFeedService.
Now I want, whenever my managed bean (or whatever web component) receives a message, to share it in all social networks. I tried:
@Inject private List<SocialNetworkService> socialNetworkServices;
But it didn’t work (deployment error). (Also tried to the @Any qualifier – same result)
So, is there a way to inject a list of all (or some) implementations of an interface?
I know the rule that a given injection point should not have more than one possible bean. I guess I can achieve that by making a producer that produces the list, and using Instance<SocialNetworkService>, but that seems like too much for this task.
Combining my attempts with an answer from the Weld forum:
InstanceimplementsIterable, so it is then possible to simply use the for-each loop. The@Anyqualifier is needed.Another way to do this is by using the event system:
MessageEvent(containing all the information about the message)instead of injecting a list of social networks, simply inject the event:
and fire it:
msgEvent.fire(new MessageEvent(message));observe the event in all services (regardless of their interface, which might be a plus):