I have two interfaces. One interface contains information, and the second interface is supposed to use the first interface. The second interface have one generic(s) that has to be a implementation of the first interface.
I want to automatically use the implementation of the second interface depending on what implementation of the first interface I receive.
Let me show the interfaces. (I changed domain and simplified it, but you get the basic idea.)
//This contains information needed to publish some information
//elsewhere, on a specific channel (MQ, Facebook, and so on)
public interface PubInfo {
    String getUserName();
    String getPassword();
    String getUrl();
    Map<String, String> getPublishingSettings();
} 
//Implementation of this interface should be for one implementation 
//PubInfo
public interface Publisher<T extends PubInfo> {
    void publish(T pubInfo, String message);
}
Lets assume I would have these implementations of PubInfo...
public class FacebookPubInfo implements PubInfo {
    // ...
}
.
public class TwitterPubInfo implements PubInfo {
    // ...
}
...and these of Publisher
@Component
public class FacebookPublisher implements Publisher<FacebookPubInfo> {
    @Override
    public void publish(FacebookPubInfo pubInfo, String message) {
        // ... do something
    }
}
.
@Component
public class TwitterPublisher implements Publisher<TwitterPubInfo> {
    // ...
}    
You get the basic idea, two interfaces with two implementations each.
To the question, finally
Now I'll come to the tricky part for me, and that is that I want to be able to automatically use TwitterPublisher when my service gets a TwitterPubInfo.
I can do that with manual mapping, as you see in the example below, but I can't help to think that it would exist a way to do this more automatically, and not depending upon manual mapping. I use spring, and I think that in there, somewhere it would exist a tool to help me with this, or maybe some other utility class, but I can't find anything.
@Service
public class PublishingService {
    private Map<Class, Publisher> publishers = new HashMap<Class, Publisher>();
    public PublishingService() {
        // I want to avoid manual mapping like this
        // This map would probably be injected, but 
        // it would still be manually mapped. Injection
        // would just move the problem of keeping a 
        // map up to date.
        publishers.put(FacebookPubInfo.class, new FacebookPublisher());
        publishers.put(TwitterPubInfo.class, new TwitterPublisher());
    }
    public void publish(PubInfo info, String message) {
        // I want to be able to automatically get the correct
        // implementation of Publisher
        Publisher p = publishers.get(info.getClass());
        p.publish(info, message);
    }
}
I could at least populate publishers in PublishingService with reflections, right?
Do I need to do it myself, or is there any help somewhere else with this?
Or, maybe you think the approach is wrong, and that there exists a smarter way to accomplish what I need to do here, feel free to say that and tell me your superior way :p of doing things (really, I appreciate it).
edit 1 start
When writing custom eventhandlers in spring it finds the correct implementation, and that is where I got my inspiration to this question.
This is from that page:
public class BlackListNotifier implements ApplicationListener<BlackListEvent> {
    // ...
    public void onApplicationEvent(BlackListEvent event) {
        // as you can see spring solves this, somehow, 
        // and I would like to be able to something similar
    }
}
Can I get the same functionality, somehow?
end edit 1
 
     
     
    