Spring DI поддерживает слабосвязанный код, потому что контейнер Spring внедряет ваши зависимости в зависимости от конфигурации.Если вы внедряете реализации интерфейса, вам не нужно менять код, чтобы изменить, какая конкретная реализация вводится, если только вы не учитываете код конфигурации, что многие делают.
Если вы используете Factory для создания сконфигурированных объектов, которыеиспользуются остальным кодом, вы пишете код для создания объектов, их настройки и т. д. Если вы хотите изменить то, что возвращает фабрика, вы должны изменить фактический код, который, как некоторые утверждают, является более навязчивое изменение.
Обычно Spring используется для настройки того, как различные слои вашего приложения соединены вместе.Например, служба X принимает такие и такие реализации DAO.Это организация уровня приложения.Допустим, у вас есть сценарий, в котором вы хотите создать кнопку для каждой строки в списке - в этом случае вы можете использовать фабрику для создания кнопок.Этот сценарий основан на ситуации времени выполнения, когда в графическом интерфейсе есть разные элементы, которые вы не могли настроить заранее (потому что он основан на данных), поэтому DI здесь имеет меньше смысла.
РЕДАКТИРОВАТЬ - на основе вашего комментариявопросы, я думаю, что основной момент здесь заключается в том, что Spring также является контейнером Inversion of Control .Это означает, что вы не программируете, какие компоненты в вашем приложении идут куда.Без IoC вы можете сделать что-то вроде
MyServiceImpl extends MyService {
Dao1 = new Dao1Impl(); // you programmatically configure which components go in here
Dao2 = new Dao2Impl();
....
}
, вместо этого вы будете делать что-то вроде
MyServiceImpl extends MyService {
public Dao1; // you haven't specified which components, only interfaces
public Dao2;
....
}
Во втором примере кода Spring (или что вы используете) будет внедрять соответствующие экземпляры DAOдля тебя.Вы переместили контроль над тем, какие компоненты использовать, на более высокий уровень.Таким образом, IoC и DI идут рука об руку, IoC способствует слабой связи, потому что в ваших определениях компонентов (то есть интерфейсах) вы только указываете поведение.
Другими словами, IoC и DI не нужны для слабой связи;у вас также может быть слабая связь с фабрикой
MyServiceImpl extends MyService {
public dao1
public dao2;
MyServiceImpl(){
dao1 = DaoFactory.getDao1();
...
}
....
}
здесь ваш сервис все еще зависит только от определений DAO , и вы используете фабрику для получения реализаций.Предостережение заключается в том, что ваш сервис теперь связан с фабрикой.Вы можете сделать его более свободным, передавая Factory в ваш конструктор, если хотите ....
Кроме того, не забывайте, что Spring предоставляет другие полезные функции, такие как управление транзакциями.Это невероятно полезно, даже если вы сказали, что для вашего приложения оно вам не нужно.