Кратко ръководство за пролетта @ Ленива анотация

1. Общ преглед

По подразбиране Spring създава всички единични зърна с нетърпение при стартиране / зареждане на контекста на приложението. Причината за това е проста: да се избягват и откриват всички възможни грешки веднага, а не по време на изпълнение.

Има обаче случаи, когато трябва да създадем боб, не при стартиране на контекста на приложението, а когато го поискаме.

В този бърз урок ще обсъдим анотацията @Lazy на Spring .

2. Мързелива инициализация

В @Lazy анотацията присъства, тъй като Spring версия 3.0. Има няколко начина да кажете на IoC контейнера да инициализира лена лениво.

2.1. @Configuration Class

Когато поставяме @Lazy анотация над класа @Configuration , това показва, че всички методи с @Bean анотация трябва да бъдат заредени лениво .

Това е еквивалентно за атрибута default-lazy-init = "true " на XML базирана конфигурация .

Нека да разгледаме тук:

@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; } }

Имайте предвид, че @Lazy е задължителен и на двете места.

С анотацията @Component за класа City и докато я препращате към @Autowired:

@Test public void givenLazyAnnotation_whenAutowire_thenLazyBean() { // load up ctx appication context Region region = ctx.getBean(Region.class); region.getCityInstance(); }

Тук, на Сити боб се инициализира само когато ние наричаме getCityInstance () метод.

3. Заключение

В този бърз урок научихме основите на анотацията @Lazy на Spring . Разгледахме няколко начина за конфигуриране и използване.

Както обикновено, пълният код за това ръководство е достъпен в GitHub.