Создание Guice Injector Singleton для согласованности - PullRequest
1 голос
/ 13 апреля 2011

Мне было интересно, как обычно используется инжектор. Я понимаю, что он используется в основном во время запуска, но как бы вы использовали его во время выполнения для создания объекта определенной реализации?

Например, у меня есть интерфейс User с реализацией UserA, UserB и UserC. Моя идея использовать Guice во время выполнения состоит в том, чтобы обернуть его в класс Singleton, чтобы я мог получать его, а не создавать новый инжектор каждый раз, когда я хочу создать экземпляр объекта User.

//Create in singleton wrapper class
Injector injector = Guice.createInjector(new SecurityModule());

//Retrieve and use at run-time (Manager is the singleton wrapper class)
Injector injector = Manager.getInstance().getInjector();
User user = injector.getInstance(User.class);

Это как обычно это делается? По сути, я хочу убедиться, что я сконцентрировал всю конфигурацию, чтобы было меньше ошибок (например, при использовании неправильного модуля). Это также проще в управлении, поэтому, если я решил использовать другой модуль конфигурации, я могу просто изменить его в классе, а не в каждом классе Java, который его использует.

Спасибо, Jack

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Вам не нужно использовать Injector непосредственно в приложении, за исключением редких и особых обстоятельств, и даже в этом случае вам определенно не следует делать его статическим синглтоном.Если вы хотите иметь возможность извлекать новые экземпляры User с помощью Guice где-нибудь в вашем приложении, вам просто нужно внедрить Provider<User> и вызвать get(), когда вам нужно.

1 голос
/ 03 июня 2013

Я бы написал:

public class Manager {
    private static Manager instance;
    // getInstance singleton method left out for brevity
    private Injector injector;
    private Manager() {
        injector = Guice.createInjector(...);
    }
    public <T> T get(Class<? extends T> cls) {
        return injector.getInstance(cls);
    }
}

так что вы можете сделать

Manager.getInstance().get(User.class) и не нужно использовать Инжектор от Guice, что позволяет вам изменять каркас Dependency Injection без изменения кода приложения.

...