Я знаю, что есть много статей, которые объясняют, как использовать CDI в Java EE, но мне трудно понять, какую пользу это приносит. Например, предположим, что у меня есть класс, который в настоящее время использует экземпляр Foo. Я мог бы сделать
Foo myFoo = new Foo();
или
// Better, FooFactory might return a mock object for testing
Foo myFoo = FooFactory.getFoo();
Я продолжаю читать, что с CDI я могу сделать:
@Inject
Foo myFoo;
но почему это лучше, чем предыдущий подход на основе factory? Я предполагаю, что есть другой вариант использования, о котором я не знаю, но я не смог его идентифицировать.
Если я понял ответы ниже, концепция заключается в том, что структура DI действует как главный объект factory, который настроен централизованно. Является ли это разумной интерпретацией?
Обновление
С тех пор я начал изучать Spring, и теперь это имеет гораздо больший смысл. Нижеприведенный абзац взят из Spring в Практике на примере класса AccountService
, который, в свою очередь, использует экземпляр AccountDao
. Я прошу прощения за длинную цитату, но я думаю, что это действительно зависит от того, почему вложенные ресурсы предлагают что-то по стандартной инициализации.
Вы могли бы создать AccountService с использованием нового ключевого слова, но создание объектов уровня сервиса редко бывает таким простым. Они часто зависят от DAO, почтовых отправителей, прокси-серверов SOAP и еще чего-то. Вы могли бы программно создать каждую из этих зависимостей в конструкторе AccountService (или через статическую инициализацию), но это приводит к жестким зависимостям и каскадным изменениям по мере их замены.
Кроме того, вы можете создавать зависимости извне и устанавливать их в AccountService с помощью методов setter или аргументов конструктора. Это приведет к устранению жестких внутренних зависимостей (если они были объявлены в интерфейсе AccountService по интерфейсу), но вы все равно дублируете код инициализации. Вот как вы создаете DAO и подключаете его до вашего AccountService Spring способ:
<bean id="accountDao" class="com.springinpractice.ch01.dao.jdbc.JdbcAccountDao"/>
<bean id="accountService"
class="com.springinpractice.ch01.service.AccountService">
<property name="accountDao" ref="accountDao"/>
</bean>
Сконфигурировав beans, как указано выше, ваша программа теперь может запросить экземпляр AccountService
из ApplicationContext Spring, а среда Spring DI будет следить за тем, чтобы создать экземпляр всего, что требуется для создания экземпляра.