Um guia rápido para a anotação Spring @Lazy

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.