定义/作用

用于指定单例bean实例化的时机,在没有指定此注解时,单例会在容器初始化时就被创建。而当使用此注解后,单例对象的创建时机会在该bean在被第一次使用时创建,并且只创建一次。第二次及以后获取使用就不再创建。

在实际开发场景中,并不是所有bean都要一开始就被创建的,有些可以等到使用时才创建。此时就可以使用该注解实现。

此注解只对单例bean有用,原型bean时此注解不起作用。

源码:

//可以作用在类上、方法上、构造器上、方法参数上、成员变量中。
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
	//是否延迟加载,默认是,如果设置为false,那跟不使用该注解一样。
    boolean value() default true;
}

@Lazy注解作用于类上时,通常与@Component及其衍生注解配合使用。
@Lazy注解作用于方法上时,通常与@Bean注解配合使用。

//与@component配合使用
@Component
@Lazy
public class UserService {

    
    public UserService(){
        System.out.println("userService创建了");
    }
}


@Configuration
@ComponentScan(basePackages = "lazyDemo")
public class SpringConfig {

    @Bean
    @Lazy
    //与@Bean注解配合使用
    public UserService userService1(){
        return new UserService();
    }
}

public class TestLazyDemo {

    private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

    @Test
    public void testLazyDemo() throws SQLException {


        System.out.println("容器初始化完成");
        UserService userService = (UserService) context.getBean("userService");
        UserService userService1 = (UserService) context.getBean("userService1");

    }
}


结果:
在这里插入图片描述
分析:
如果是立即加载的bean的话,下面那两条语句应该先打印出来,如果是延迟加载的bean的话,会在第一次使用,getBean的时候创建。也可以打断点测试。

Logo

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

更多推荐