Um guia rápido para a anotação Spring @Lazy
1. Visão geral
By default, Spring creates all singleton beans eagerly at the startup/bootstrapping of the application context. A razão por trás disso é simples: para evitar e detectar todos os erros possíveis imediatamente, em vez de no tempo de execução.
No entanto, há casos em que precisamos criar um bean, não na inicialização do contexto do aplicativo, mas quando solicitamos.
Neste tutorial rápido, vamos discutir a anotação@Lazy do Spring.
2. Inicialização lenta
A anotação@Lazy está presente desde o Spring versão 3.0. Existem várias maneiras de dizer ao contêiner IoC para inicializar um bean preguiçosamente.
2.1. Classe@Configuration
When we put @Lazy annotation over the @Configuration class, it indicates that all the methods with @Bean annotation should be loaded lazily.
Este é o equivalente para o atributodefault-lazy-init= “true _“ _ da configuração baseada em XML.
Vamos dar uma olhada aqui:
@Lazy
@Configuration
@ComponentScan(basePackages = "com.example.lazy")
public class AppConfig {
@Bean
public Region getRegion(){
return new Region();
}
@Bean
public Country getCountry(){
return new Country();
}
}
Vamos agora testar a funcionalidade:
@Test
public void givenLazyAnnotation_whenConfigClass_thenLazyAll() {
AnnotationConfigApplicationContext ctx
= new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
ctx.getBean(Region.class);
ctx.getBean(Country.class);
}
Como vemos, todos os beans são criados apenas quando os solicitamos pela primeira vez:
Bean factory for ...AnnotationConfigApplicationContext:
...DefaultListableBeanFactory: [...];
// application context started
Region bean initialized
Country bean initialized
Para aplicar isso a apenas um bean específico, vamos remover o@Lazy de uma classe.
Em seguida, adicionamos à configuração do bean desejado:
@Bean
@Lazy(true)
public Region getRegion(){
return new Region();
}
2.2 With @Autowired
Antes de prosseguir, verifique esses guias para as anotações de@Autowirede@Component.
Aqui,in order to initialize a lazy bean, we reference it from another one.
O bean que queremos carregar preguiçosamente:
@Lazy
@Component
public class City {
public City() {
System.out.println("City bean initialized");
}
}
E é referência:
public class Region {
@Lazy
@Autowired
private City city;
public Region() {
System.out.println("Region bean initialized");
}
public City getCityInstance() {
return city;
}
}
Observe que o@Lazy é obrigatório em ambos os lugares.
Com a anotação@Component na classeCity e ao referenciá-la com@Autowired:
@Test
public void givenLazyAnnotation_whenAutowire_thenLazyBean() {
// load up ctx appication context
Region region = ctx.getBean(Region.class);
region.getCityInstance();
}
Aqui,the City bean is initialized only when we call the getCityInstance() method.
3. Conclusão
Neste tutorial rápido, aprendemos o básico da anotação@Lazy do Spring. Examinamos várias maneiras de configurá-lo e usá-lo.
Como de costume, o código completo para este guia está disponívelover on GitHub.