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();
}
上一篇: 国内风景区有哪些 国内风景区盘点
下一篇: 国内适合情侣去的旅游地方大全