Как сделать класс без аргумента конструктор singleton и позволить автоматически вводить переменные? - PullRequest
1 голос
/ 15 марта 2019

У меня есть ниже пример кода

public interface MyDao {
    ...
}

public class MyDaoImpl implements MyDao {
    ...
}

public class MyService {
    @Inject
    private MyDao myDao;

    ...
}

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bind(MyDao.class).to(MyDaoImpl.class).in(Singleton.class);
    }
}

В основном классе у меня

Injector injector = Guice.createInjector(new MyModule());
MyService myService = injector.getInstance(MyService.class);
MyService myService2 = injector.getInstance(MyService.class);

myService и myService2 - разные объекты.

Если я добавлю ниже код в MyModule

@Provides
@Singleton
public MyService getMyService() {
    return new MyService();
}

myService и myService2 становятся одним и тем же объектом, но переменная myDao становится нулевой.

Как я могу сделать MyService синглетон и позволить автоинъекции переменной myDao без изменения конструктора MyService?

1 Ответ

2 голосов
/ 15 марта 2019

В приведенном вами примере вы генерируете MyService, просто вызывая его конструктор, а не инъекцию.

Чтобы решить вашу проблему, вы можете связать свой сервис в конфигурации и создать его с помощьювызов getInstance

public class MyModule {
    @Override
    public void configure() {
        bind(MyDao.class).to(MyDaoImpl.class).in(Singleton.class);
        bind(MyService.class).in(Singleton.class);
    }
}

Обратите внимание, что, как указано chrylis , было бы лучшим решением изменить конструктор или добавить установщик для объекта MyDao вMyService класс.Если вам когда-либо придется создавать свой объект без внедрения или даже менять структуру внедрения, это сэкономит вам несопоставимое количество времени.

...