Inicialização preguiçosa no Spring Boot 2

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:

  1. 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

  2. Como nenhum dos beans é criado até que sejam necessários,we could mask issues, getting them in run time instead of startup time

  3. Os problemas podem incluir erros de falta de memória, configurações incorretas ou erros encontrados na definição de classe

  4. 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.