Цель внедрения зависимости и инверсии управления проста:
- Вы определяете свои инъекционные средства (например, услуги) один раз , и они создаются один раз (если не указано иное).
- Эти инъецируемые затем используются везде, где это применимо , и вы не контролируете их жизненный цикл, объем или состояние.
Хотя я чувствую, что последний пункт довольно молчаливо отвечает на ваш основной вопрос, я уточню - в контексте DI единственное, что действительно имеет значение, - это принудительные контракты.То есть, если ваша служба подписывается на определенный тип контракта, и у вас есть компонент, который хочет внедрить службу, которая выполняет этот контракт, то ваш уровень DI должен добросовестно зарегистрировать службу, которая может выполнить этот контракт.
Вы попадаете в увлекательные и захватывающие вещи с приоритетом бина, квалификаторами и профилями приложений на этом этапе, но это общая идея.
Для конкретного примера: javax.sql.DataSource
- это интерфейс, который реализуетсямногие решения на основе JDBC, такие как MySQL, Postgres, Oracle и другие.Если вы хотите иметь два разных bean-компонента, которые взаимодействуют с двумя разными базами данных, но вы хотите использовать их взаимозаменяемо, вы определяете bean-компонент типа DataSource
для использования и настройки , который получает источника данных.создано.Опять же, это включает в себя такие вещи, как @Qualifier
, чтобы гарантировать, что вы подключите наиболее конкретный компонент в наиболее подходящее время.
Кроме того, последний момент довольно важен для ответа на эту часть вашего вопроса:
... и в этом случае два потока могут параллельно изменять данные внутри бина?
Это очень неразумно создаватьинъекционный боб со своим собственным внутренним состоянием.То есть, если вы SampleService
присоединяетесь к какому-либо кешированному состоянию с коллекцией внутри него, вы в основном нарушаете ожидания, поскольку не знаете, когда или как часто в эту коллекцию будут добавлены элементы.или удалены из него.
Лучшее соглашение - иметь компоненты, которые могут ссылаться на сервисы с состоянием, но не сохранять это состояние в самом компоненте (например, соединение с базой данных, но не во всей таблице базы данных).