Рубрики
Без рубрики

Краткое руководство по аннотации Spring @Lazy

Узнайте, как лениво создавать экземпляры Spring beans с помощью аннотации @Lazy.

Автор оригинала: baeldung.

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 .