Как указал ColinD, в вашем примере D не будет создан Guice. Вызов new для объекта создаст его вне Guice DI. Если вы хотите подтвердить, что что-то создается с помощью Guice, вы можете добавить ведение журнала в методы сеттера @Inject или, если вы делаете инъекцию в конструктор, вы можете добавить новый метод только для целей ведения журнала:
@Inject
public void log() {
logger.debug(//check if injected classes have been set)
...
}
Переоборудовав большое приложение Swing для использования Guice и написав новое с нуля, нужно помнить несколько вещей.
1) Guice не был предназначен для настольных приложений. Он был создан для использования на серверах. Время запуска не то, что было принято во внимание. После полной конвертации приложения Swing со всех статических фабрик во все Guice оно добавило ~ 30/60 секунд к времени запуска в зависимости от того, был ли это холодный или теплый запуск.
2) Очень сложно добавить только немного Guice. Теперь, когда вы обнаруживаете, вам быстро понадобится зависимость от созданного класса на три уровня глубиной, и вам придется либо преобразовать все это в Guice, либо начать передавать множество классов через конструкторы и добавить геттеры
3) Остерегайтесь нетерпеливо создавать объекты с помощью Guice. @Singleton по умолчанию с готовностью создает объект при запуске. Это может иметь катастрофические последствия для времени запуска приложения. Если вы беспокоитесь об этом, на форуме Guice есть хорошая ветка о создании @EagerSingleton или @LazySingleton, которую вы можете захотеть проверить
4) С учетом всего сказанного, Guice довольно крутой, просто нужно знать, как он работает, чтобы добиться хорошей производительности с ним в настольном приложении