作者:小猿聊编程
更多资料:https://www.techlearn.cn/

作用:@Lazy可以实现bean的延迟初始化,在spring容器启动时不初始化Bean,直到用到这个Bean的时候才去初始化.

使用范围:任意类型、方法、构造器、参数、字段。

参数:value -> boolean类型,用来配置是否应发生延迟初始化,默认是true

定义:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR,
ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
    boolean value() default true;
}
1、搭配@Component使用
@Component
@Lazy //@1
public class Service1 {
    public Service1(){
        System.out.println("create service1");
    }
}

@1: 使用到了@Lazy,默认值为true,表示会被延迟初始化,在容器启动过程中中会被初始化,当从容器中查找这个bean的时候才会初始化。

2、搭配@Configuration类中使用

@Lazy和@Configuration一起使用,此时配置类中所有通过@Bean方式注册的bean都会被延迟初始化,不过也可以在@Bean标注的方法上使用@Lazy来覆盖配置类上的@Lazy配置,看下面代码:

@Configuration
@Lazy //@1
public class ServiceConfig {

    @Bean
    public Service1 service1(){
      return new Service1();
    }

    @Bean
    @Lazy(value = false)  //@2
    public Service2 service2(){
        return new Service2();
    }
}

@1: 在配置类上使用了@Lazy,此时会对当前类中所有的@Bean标注的方法生效

@2: 这个方法上使用了@Lazy(value = false),则表明此时service2不会被延迟初始化,其它的bean仍然会延迟初始化。

3、搭配@ComponentScan类中使用
@ComponentScan(value = "XXX.XXX", lazyInit = true)
@Configuration
public class ServiceConfig {
    
}
@Lazy失效示例

非延迟加载的Controller

@Controller
public class TestController implements InitializingBean{
    @Autowired
    private TestService testService;
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("testController Initializing");
    }
}

延迟加载的Service

@Lazy
@Service
public class TestService implements InitializingBean {
  
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("testService Initializing");
    }
  
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐