Inicialização preguiçosa no Spring Boot 2
1. Visão geral
Neste tutorial, veremos como configurar a inicialização lenta no nível do aplicativo, começando comSpring Boot 2.2
2. Inicialização lenta
Por padrão no Spring, todos os beans definidos e suas dependências são criados quando o contexto do aplicativo é criado.
Em contraste, quando configuramos um bean com inicialização lenta, o bean só será criado e suas dependências injetadas, uma vez que forem necessárias.
3. A dependência do Maven
Para obter o Spring Boot 2.2 em nosso aplicativo, precisamos incluí-lo em nosso caminho de classe.
Com o Maven, podemos apenas adicionarthe spring-boot-starter dependency:
org.springframework.boot
spring-boot-starter
2.2.0.M3
spring-milestones
Spring Milestones
https://repo.spring.io/milestone
Observe que o repositório é necessário apenas porque estamos usando uma liberação de marco para este tutorial.
4. Ativar inicialização lenta
Spring Boot 2.2 apresenta a propriedadespring.main.lazy-initialization, tornando mais fácil configurar a inicialização lenta em todo o aplicativo.
Definir o valor da propriedade comotrue significa que todos os beans no aplicativo usarão inicialização lenta.
Vamos configurar a propriedade em nosso arquivo de configuraçãoapplication.yml:
spring:
main:
lazy-initialization: true
Ou, se for o caso, em nosso arquivoapplication.properties:
spring.main.lazy-initialization=true
Essa configuração afeta todos os beans no contexto. Portanto, se quisermos configurar a inicialização lenta para um bean específico, podemos fazer isso por meio de@Lazy approach.
Ainda mais, podemos usar a nova propriedade, em combinação com a anotação@Lazy, definida comofalse.
Ou em outras palavras,all the defined beans will use lazy initialization, except for those that we explicitly configure with @Lazy(false).
5. Run
Vamos criar um serviço simples que nos permitirá testar o que acabamos de descrever.
Ao adicionar uma mensagem ao construtor, saberemos exatamente quando o bean foi criado.
public class Writer {
private final String writerId;
public Writer(String writerId) {
this.writerId = writerId;
System.out.println(writerId + " initialized!!!");
}
public void write(String message) {
System.out.println(writerId + ": " + message);
}
}
Além disso, vamos criar oSpringApplication e injetar o serviço que criamos antes.
@SpringBootApplication
public class Application {
@Bean("writer1")
public Writer getWriter1() {
return new Writer("Writer 1");
}
@Bean("writer2")
public Writer getWriter2() {
return new Writer("Writer 2");
}
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
System.out.println("Application context initialized!!!");
Writer writer1 = ctx.getBean("writer1", Writer.class);
writer1.write("First message");
Writer writer2 = ctx.getBean("writer2", Writer.class);
writer2.write("Second message");
}
}
Vamos definir o valor da propriedadespring.main.lazy-initialization parafalse e executar nosso aplicativo.
Writer 1 initialized!!!
Writer 2 initialized!!!
Application context initialized!!!
Writer 1: First message
Writer 2: Second message
Como podemos ver, os beans foram criados quando o contexto do aplicativo foi iniciado.
Agora vamos alterar o valor despring.main.lazy-initialization paratrue e executar nosso aplicativo novamente.
Application context initialized!!!
Writer 1 initialized!!!
Writer 1: First message
Writer 2 initialized!!!
Writer 2: Second message
Como resultado, o aplicativo não cria os beans no momento da inicialização, mas apenas quando precisa deles.
6. Efeitos da inicialização lenta
Habilitar a inicialização lenta em todo o aplicativo pode produzir efeitos positivos e negativos.
Vamos falar sobre alguns deles, já que são descritosin the official announcement da nova funcionalidade:
-
A inicialização lenta pode reduzir o número de beans criados quando o aplicativo está iniciando - portanto,we can improve the startup time do aplicativo
-
Como nenhum dos beans é criado até que sejam necessários,we could mask issues, getting them in run time instead of startup time
-
Os problemas podem incluir erros de falta de memória, configurações incorretas ou erros encontrados na definição de classe
-
Além disso, quando estamos em um contexto da web,triggering bean creation on demand will increase the latency of HTTP requests - a criação do bean afetará apenas a primeira solicitação, masthis may have a negative impact in load-balancing and auto-scaling.
7. Conclusão
Neste tutorial, configuramos a inicialização lenta com a nova propriedadespring.main.lazy-initialization, introduzida no Spring Boot 2.2.
Como sempre, o código-fonte deste tutorial está disponívelover on GitHub.