作者:小猿聊编程
更多资料: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");
}
}