2017-08-26 2 views
0

J'ai une classe qui doit être créée pendant la phase d'injection mais cette instance ne sera référencée nulle part dans le code. La façon dont cette classe communique avec les autres est via le bus de l'événementGuice: création d'objet non référencé

public class DefaultCounterTracker { 
    private final EventBus eventBus; 
    private final ReplicatedMap<String, String> trackerCache; 

    @Inject 
    public DefaultCounterTracker(
    EventBus eventBus, 
    @Named("CountersTrackerCache") ReplicatedMap<String, String> trackerCache) 
    { 
    this.eventBus = eventBus; 
    this.trackerCache = trackerCache; 
    bindListeners(); 
    } 

    private void bindListeners() 
    { 
    eventBus.localConsumer(CounterCreated.name(), (Handler<Message<String>>) event -> 
    { 
     handleCreation(event.body()); 
    }); 
    eventBus.localConsumer(CounterDestroyed.name(), (Handler<Message<String>>) event -> 
    { 
     handleDestruction(event.body()); 
    }); 
    } 

Debugging J'ai vu que cette classe est créée uniquement lorsque quelque part dans le code, il est écrit

@Inject 
DefaultCounterTracker counterTracker 

J'ai essayé liaison à l'aide d'un mais rien ne change: il semble que si la classe n'est pas référencée, Guice ne la créera pas. Y a-t-il un moyen de dire à Guice de le faire? Ai-je manqué le point?

Je pourrais aussi créer l'instance manuellement mais si je change d'implémentation par défaut de l'un des paramètres (EventBus par exemple) je dois aussi me rappeler de changer l'appel dans le constructeur.

Toute suggestion apprécié

Répondre

0

Si la classe est mentionné censé être un Singleton, alors vous pouvez créer un objet de cette classe avec impatience en spécifiant une fixation dans votre méthode configure() de la classe AbstractModule.

bind(DefaultCounterTracker.class).to(DefaultCounterTracker.class).asEagerSingleton();