По умолчанию реализации ApplicationContext отлично справляются с созданием и конфигурацией всех бинов-одиночек в рамках процесса инициализации. Как правило, такое предварительное создание экземпляра является желательным, поскольку ошибки в конфигурации или среде обнаруживаются немедленно, а не спустя часы или даже дни. Если такое поведение нежелательно, можно предотвратить предварительное создание экземпляра бина-одиночки, пометив в определении бина "отложенную инициализацию". Бин с отложенной инициализацией дает команду IoC-контейнеру создать экземпляр бина при первом запросе, а не при запуске.

В XML это поведение контролируется атрибутом lazy-init элемента <bean/>, как показано в следующем примере:

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>

Если предыдущая конфигурация используется ApplicationContext, бин lazy предварительно не создается, когда запускается ApplicationContext, в то время как бин not.lazy создается предварительно без всяких задержек.

Однако, если бин с отложенной инициализацией является зависимостью бина-одиночки, который не является бином с отложенной инициализацией, ApplicationContext создает бин с отложенной инициализацией при запуске, поскольку он должен удовлетворять зависимостям бина-одиночки. Бин с отложенной инициализацией внедряется в бин-одиночку в другом месте, где нет отложенной инициализации.

Управлять отложенной инициализацией можно также на уровне контейнера, используя атрибут default-lazy-init в элементе <bean/>, как показано в следующем примере:

<beans default-lazy-init="true">
    <!-- бины не будут предварительно созданы... -->
</beans>