2016-07-26 21 views
0

So hava ich eine Mapper-Klasse:Wie kann ich in Guice ein Singleton erstellen, das einen Konstruktor mit einem Flag verwendet?

public class TmaticMapper implements Mapper { 

private static final long serialVersionUID = 42L; 
private static final Logger log = LoggerFactory.getLogger(TmaticMapper.class); 
private MapperFactory mf = null; 
private MapperFacade mapperFacade = null; 
private Map<String, List<String>> toDoList = new HashMap<String, List<String>>(); 

public TmaticMapper(Configuration propKey) { 
    super(); 
    this.mf = this.buildMapperFactory(propKey.toString()); 
    this.mapperFacade = mf.getMapperFacade(); 
} 

Dass ich als Singleton verwenden müssen. Die Klasse ist auf zwei Arten konstruiert, aber ich brauche nur eine davon (und ich möchte wirklich nur eine machen. Es macht Dinge wie das Ändern von Byte-Code und ich will nur, dass es einmal pro Jvm seine Sache macht). Ich habe "@Singleton" und so versucht, aber ich sehe keinen Unterschied beim Start.

Ich benutze diese instantiate:

binder.bind(Mapper.class).annotatedWith(Names.named("RecordToDto")).toInstance(new TmaticMapper(Mapper.Configuration.recordToDto)); 

und injizieren diese Weise:

@Inject 
    @Named("RecordToDto") 
    private Mapper tMapper; 

Wie instanziieren ich nur eine dieser beim Start und es spritzen?

Antwort

0

Versuchen Sie, einen Provider mit @Provides zu erstellen, anstatt die Bindesyntax im Modul config() Methode zu verwenden. Dadurch können Sie dem vom Provider zurückgegebenen Singleton eine Logik hinzufügen.

Beispielmodul:

public class YourModule extends AbstractModule { 

    private Config config 

    public YourModule(Config config) { 
    this.config = config; 
    } 

    @Override 
    protected void configure() {/*prefer providers*/} 

    @Provides 
    @Singleton 
    public TmaticMapper providesTmaticMapper(Config config) { 
    if (myflag) { 
     return new TmaticMapper(config); 
    } 
    else { 
     return new TmaticMapper(config); 
    } 
    } 
} 

Erstellen Sie Ihre Injektor:

Injector injector = Guice.createInjector(new YourModule(config)); 

Instanz des Singleton-Adresse:

TmaticMapper mapper = injector.getInstance(TmaticMapper.class); 

Jedes Mal, wenn Sie getInstance() an diesem Injektor rufen erhalten Sie die gleiche Instanz von TmaticMapper. Wenn Sie einen anderen Injektor erstellen, erhalten Sie eine neue Instanz, die auf diesen Injektor beschränkt ist.

+0

Das macht immer noch ein neues ... – markthegrea

+0

jedes mal was? –

+0

Jedes Mal, wenn es getroffen wird? Ich brauche diesen Mapper in mehreren Instanzen anderer Klassen ... – markthegrea