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

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

1. обзор

By default, Spring creates all singleton beans eagerly at the startup/bootstrapping of the application context. Причина этого проста: избегать и обнаруживать все возможные ошибки сразу, а не во время выполнения.

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

В этом кратком руководстве мы собираемся обсудить аннотацию Spring@Lazy.

2. Ленивая инициализация

Аннотация@Lazy присутствует с версии Spring 3.0. Есть несколько способов указать контейнеру IoC лениво инициализировать bean-компонент.

2.1. @Configuration Класс

When we put @Lazy annotation over the @Configuration class, it indicates that all the methods with @Bean annotation should be loaded lazily.

Это эквивалент атрибута "true _" _ конфигурации на основе XMLdefault-lazy-init=.

Давайте посмотрим здесь:

@Lazy
@Configuration
@ComponentScan(basePackages = "com.example.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

Чтобы применить это только к определенному bean-компоненту, давайте удалим@Lazy из класса.

Затем мы добавляем его в конфиг нужного компонента:

@Bean
@Lazy(true)
public Region getRegion(){
    return new Region();
}

2.2 With @Autowired

Прежде чем продолжить, ознакомьтесь с этими руководствами для аннотаций@Autowired и@Component.

Здесьin order to initialize a lazy bean, we reference it from another one.

Боб, который мы хотим загрузить лениво:

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

Здесьthe City bean is initialized only when we call the getCityInstance() method.

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

В этом кратком руководстве мы изучили основы аннотации Spring@Lazy. Мы рассмотрели несколько способов его настройки и использования.

Как обычно, доступен полный код этого руководстваover on GitHub.