Чтобы ответить на ваш вопрос с точки зрения низкого уровня:
lazy-init="true"
означает, что bean-компонент не будет создан при создании контекста, но будет создан при обращении к нему, например, другим бобом. Я думаю, что это ясно, также из комментария @AravindA.
Боб Scoped работает по-разному. Когда контекст создается, этот bean-объект оборачивается в дополнительный прокси-объект (по умолчанию созданный CGLIB), который передается в bean-компонент, который ссылается на него (этот proxy по умолчанию одноэлементный, например общий). Таким образом, каждый раз, когда метод вызывается на прокси во время выполнения, Spring пересекает вызов, запрашивает у фабрики вернуть экземпляр компонента и вызывает метод для этого компонента. Фабрика, в свою очередь, может искать «настоящий» экземпляр компонента, например в запросе HTTP (область «запрос») или сеанс HTTP (область «сеанс») и / или при необходимости создайте новый экземпляр. Позднее создание экземпляров позволяет инициализировать bean-объект с областями видимости значениями «времени выполнения» (области действия), например, значения из HTTP-запроса / сеанса, которые явно не определены при создании контекста. В частности, bean-объекты «step» связаны с локальным потоком (помните, что шаги выполняются параллельно для разделения). Таким образом, bean-объекты scoped разыменовываются, когда вы вызываете для них метод. Наконец, можно легко нарушить эту элегантную «идеологию» Spring, вызвав любой метод в bean-объекте области сразу после того, как для него задан другой bean-компонент (например, в установщике):)