Spring @Lazy注解快速指南

2023/05/11

1. 概述

默认情况下,Spring在应用程序上下文的启动/引导时急切地创建所有单例bean。这背后的原因很简单:立即避免和检测所有可能的错误,而不是在运行时。

但是,在某些情况下,我们需要在请求它时才创建bean,而不是在应用程序上下文启动时。

在这个快速教程中,我们将讨论Spring中的@Lazy注解

2. 延迟初始化

@Lazy注解自Spring 3.0版本起就存在。有几种方法可以告诉IoC容器延迟初始化bean。

2.1 @Configuration类

当我们将@Lazy注解放在@Configuration类上时,它表示所有带有@Bean注解的方法都应该延迟加载

这等效于基于XML配置的default-lazy-init=”true”属性。

让我们看看下面的AppConfig配置类:

@Lazy
@Configuration
@ComponentScan(basePackages = "cn.tuyucheng.taketoday.lazy")
public class AppConfig {

    @Bean
    public Region getRegion() {
        return new Region();
    }

    @Bean
    public Country getCountry() {
        return new Country();
    }
}

现在让我们测试一下功能:

class LazyAnnotationUnitTest {

    @Test
    void givenLazyAnnotation_whenConfigClass_thenLazyAll() {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(AppConfig.class);
        ctx.refresh();
        ctx.getBean(Region.class);
        ctx.getBean(Country.class);
    }
}

如我们所见,所有bean仅在我们第一次请求它们时才会创建:

Region bean initialized
Country bean initialized

要仅将其应用于特定的bean,让我们从类上删除@Lazy。

然后我们将它添加到所需bean的配置上:

@Lazy
@Bean
public Region getRegion() {
    return new Region();
}

2.2 与@Autowired使用

在继续之前,请查看这些文章以了解@Autowired@Component注解。

为了初始化一个惰性bean,我们从另一个bean引用它

我们要延迟加载的bean:

@Lazy
@Component
public class City {

    public City() {
        System.out.println("City bean initialized");
    }
}

引用它的bean:

public class Region {

    @Lazy
    @Autowired
    private City city;

    public Region() {
        System.out.println("Region bean initialized");
    }

    public City getCityInstance() {
        return city;
    }
}

请注意,@Lazy在这两个地方都是强制性的

在City类上使用@Component注解并使用@Autowired引用它:

@Test
void givenLazyAnnotation_whenAutowire_thenLazyBean() {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class);
    ctx.refresh();
    Region region = ctx.getBean(Region.class);
    region.getCityInstance();
}

在这里,City bean只有在我们调用getCityInstance()方法时才被初始化

3. 总结

在这个快速教程中,我们介绍了Spring中@Lazy注解的基本使用,以及几种配置和使用它的方法。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章