По умолчанию реализации 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>
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ