К основному контенту

Сообщения

Сообщения за июнь, 2017

IoC-контейнер изнутри

В этой статье предлагаю разобраться чем занимается IoC-контейнер и как это определяет его внутреннюю структуру. Исходить будем из задачи, которую решает контейнер: создать и скомпоновать объекты таким образом, чтобы все зависимости этих объектов были удовлетворены. Очевидно, что зависимости необходимо некоторым образом описать: объект, называемый так-то, скажем A, зависит от других объектов, например B и C. При этом контейнер ничего не знает о том, какой из объектов мы называем A, а какие — B и C. Это тоже необходимо описать. Контейнер оперирует только теми компонентами, которые он знает (часто их называют бинами). Для создания объекта контейнеру необходимо также знать к какому классу объектов он принадлежит и как долго его помнить. Самый простой способ предоставить все эти данные (с точки зрения устройства контейнера, конечно) — напрямую обратиться к регистрационному методу контейнера, передав ему в качестве параметра некоторый объект с метаданными. Второй вариант: промаркировать

java.util.stream.Stream как результат выборки из базы данных

В этом посте предлагаю свои мысли о методе stream() интерфейса Query . Этот метод появился в Hibernate не так давно, в версии 5.2, в рамках поддержки новых возможностей Java 8. Что же за ним скрывается, какие особенности его использования и нужен ли он вам? Давайте разберемся. Сперва предлагаю задаться вопросом: почему бы не воспользоваться методом list() того же интерфейса и получать объект Stream уже из него? Так можно сделать, если результат вашей выборки относительно небольшой. Если же вам, например, надо экспортировать многомиллионную таблицу этот вариант плох в плане использования оперативной памяти. До этого вы скорее всего пользовались методом scroll() в подобных случаях, но он возвращает ScrollableResults , который не является коллекцией и не содержит метод, возвращающий Stream . Теперь вы можете воспользоваться новым методом, чтобы вычитывать данные по мере необходимости. Что же представляет собой метод stream() внутри? Это альтернативная реализация метода scroll()