Краткое руководство по 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.