Мне кажется, что вам нужно использовать функции, которые может дать вам правильная структура внедрения зависимостей. Не используйте другую логику построения для тестирования / производства.
С пружиной, одиночные впрыскивания выполняются только при запуске контейнера. Инъекции прототипа делаются каждый раз. Полная проводка также выполняется каждый раз, когда вы запускаете модульный тест, если он подключен. Поэтому профилирование юнит-тестов, как правило, не очень хорошая идея.
Может быть, вы используете слишком мало областей применения синглтона и слишком большой объем прототипа? (Прототип = новый экземпляр каждый раз)
Хорошая особенность пружинного впрыска состоит в том, что вы можете использовать прокси области видимости, то есть ваш объектный граф может выглядеть так:
A Singleton
|
B Singleton
|
C Prototype (per-invocation)
|
D Singleton
|
E Session scope (web app)
|
F Singleton
И каждый запрос будет создавать только 1 экземпляр C и один экземпляр E на сеанс. A, B, D и F являются синглетонами. Если это не веб-приложение, у вас по умолчанию нет области действия сеанса, но вы также можете создавать собственные области действия (область «Окно» звучит круто для оконного настольного приложения). Подсказка заключается в том, что вы можете «представить» области на любом уровне, фактически вы можете иметь десять слоев одноэлементных объектов, и внезапно появляется что-то на уровне сеанса. (Это действительно может революционизировать реализацию некоторых сквозных функций в многоуровневой архитектуре, но это другая история)
Это действительно дает минимальное возможное создание объекта в модели DI, я думаю.
Хотя это Spring для Java, я считаю, что ряд других DI-структур должен поддерживать аналогичные функции. Возможно, не самые минималистичные.