Spring高级之注解@lazy详解(超详细)
定义/作用用于指定单例bean实例化的时机,在没有指定此注解时,单例会在容器初始化时就被创建。而当使用此注解后,单例对象的创建时机会在该bean在被第一次使用时创建,并且只创建一次。第二次及以后获取使用就不再创建。在实际开发场景中,并不是所有bean都要一开始就被创建的,有些可以等到使用时才创建。此时就可以使用该注解实现。此注解只对单例bean有用,原型bean时此注解不起作用。源码://可以作用
·
定义/作用
用于指定单例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的时候创建。也可以打断点测试。
更多推荐
已为社区贡献3条内容
所有评论(0)