欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring @Lazy注解使用指南

程序员文章站 2022-05-21 22:11:48
...

Spring @Lazy注解使用指南

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

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

2.延迟初始化

从spring3.0开始,@Lazy注释已经存在。 有几种方法可以告诉IoC容器惰性地初始化bean。

2.1. @Configuration配置类

当在@Configuration类上放置@Lazy注解时,表明所有带有@Bean注解的方法都应延迟加载。

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

@Lazy
@Configuration
@ComponentScan(basePackages = "com.example.demo.lazy")
public class AppConfig {
    @Bean
    public Region getRegion(){
        return new Region();
    }

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

单元测试

 @Test
public void givenLazyAnnotation_whenConfigClass_thenLazyAll() {

    AnnotationConfigApplicationContext ctx
        = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class);
    ctx.refresh();
    ctx.getBean(Region.class);
    ctx.getBean(Country.class);
}

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

然后,将其添加到所需bean的配置中:

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

2.2使用@Autowired

在这里,为了初始化一个懒惰的bean,从另一个类引用。

@Lazy
@Component
public class City {
    public City() {
        System.out.println("City bean initialized");
    }
}

引用City

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引用它时:

public class Region {

    @Lazy
    @Autowired
    private City city;

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

    public City getCityInstance() {
        return city;
    }
}
@Test
public void test2() {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class);
    ctx.refresh();
    Region region = ctx.getBean(Region.class);
    region.getCityInstance();
}
相关标签: spring