1. Обзор
По умолчанию Spring охотно создает все одноэлементные компоненты при запуске/начальной загрузке контекста приложения. Причина этого проста: избегать и обнаруживать все возможные ошибки немедленно, а не во время выполнения.
Однако бывают случаи, когда нам нужно создать компонент не при запуске контекста приложения, а когда мы запрашиваем его.
В этом кратком уроке мы обсудим весенние @Ленивый аннотация.
2. Ленивая инициализация
Аннотация @Lazy присутствует с весны версии 3.0. Существует несколько способов сообщить контейнеру IoC, чтобы он лениво инициализировал боб.
2.1. @Класс конфигурации
Когда мы помещаем @Lazy аннотацию поверх класса @Configuration , это указывает на то, что все методы с аннотацией @Bean должны загружаться лениво .
Это эквивалентно для конфигураций на основе XML default-lazy-init= “true “ атрибут.
Давайте посмотрим здесь:
@Lazy @Configuration @ComponentScan(basePackages = "com.baeldung.lazy") public class AppConfig { @Bean public Region getRegion(){ return new Region(); } @Bean public Country getCountry(){ return new Country(); } }
Теперь давайте проверим функциональность:
@Test public void givenLazyAnnotation_whenConfigClass_thenLazyAll() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); ctx.getBean(Region.class); ctx.getBean(Country.class); }
Как мы видим, все бобы создаются только тогда, когда мы запрашиваем их в первый раз:
Bean factory for ...AnnotationConfigApplicationContext: ...DefaultListableBeanFactory: [...]; // application context started Region bean initialized Country bean initialized
Чтобы применить это только к определенному компоненту, давайте удалим @Lazy из класса.
Затем мы добавим его в конфигурацию нужного компонента:
@Bean @Lazy(true) public Region getRegion(){ return new Region(); }
2.2 С @Autowired
Прежде чем продолжить, ознакомьтесь с этими руководствами для @Autowired и @Component аннотаций.
Здесь, чтобы инициализировать ленивый боб, мы ссылаемся на него из другого.
Боб, который мы хотим лениво загрузить:
@Lazy @Component public class City { public City() { System.out.println("City bean initialized"); } }
И это ссылка:
public class Region { @Lazy @Autowired private City city; public Region() { System.out.println("Region bean initialized"); } public City getCityInstance() { return city; } }
Обратите внимание, что @Ленивый является обязательным в обоих местах.
С аннотацией @Component в классе City и при ссылке на него с помощью @Autowired:
@Test public void givenLazyAnnotation_whenAutowire_thenLazyBean() { // load up ctx appication context Region region = ctx.getBean(Region.class); region.getCityInstance(); }
Здесь компонент City инициализируется только при вызове метода getCity Instance () .
3. Заключение
В этом кратком уроке мы изучили основы аннотации Spring @Lazy . Мы рассмотрели несколько способов его настройки и использования.
Как обычно, полный код этого руководства доступен на GitHub .