Springboot注解 - @Lazy和@Scope
springboot注解说明:
- 默认情况下 spring 容器中都是单实例。
- @Lazy注解
- value=false:默认在容器启动的时候创建对象
- value=true:懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化
- @Scope注解
- prototype:多例。IOC容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象;
- singleton:单例。IOC容器启动会调用方法创建对象放到ioc容器中。 以后每次获取是直接从容器(map.get())中拿,全局有且仅有一个实例
下面进行一些单元测试,说明@Lazy注解、@Scope注解和@Lazy与@Scope混用的结果。
一、@Lazy注解
1、测试@Lazy(value = true)。@Lazy的value默认值就是等于true,所以这句其实应该写成@Lazy即可,这里为便于理解,所以写了完整语句。
测试类
1 @Configuration 2 public class NoScopeLazyTrue{ 3 @Bean 4 @Lazy 5 public NoScopeLazyTrue NoScopeLazyTrue(){ 6 System.out.println("向spring容器中添加NoScopeLazyTrue类"); 7 return new NoScopeLazyTrue(); 8 } 9 }
单元测试
/** * 测试条件:@Lazy=true 不写@Scope注解 * 测试期望结果:NoScopeLazyTrue在spring后加载 */ @Test public void LazyTrueTest(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(NoScopeLazyTrue.class); System.out.println("spring容器初始化完成"); NoScopeLazyTrue noScopeLazyTrue = (NoScopeLazyTrue) ac.getBean("NoScopeLazyTrue"); }
单元测试结果
2、测试@Lazy(value = false)。
测试类
@Configuration public class NoScopeLazyFalse{ @Bean @Lazy(false) public NoScopeLazyFalse NoScopeLazyFalse(){ System.out.println("向spring容器中添加NoScopeLazyFalse类"); return new NoScopeLazyFalse(); } }
单元测试:
/** * 测试条件:@Lazy=false 不写@Scope注解 * 测试期望结果:NoScopeLazyFalse优先spring加载 */ @Test public void LazyFalseTest(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(NoScopeLazyFalse.class); System.out.println("spring容器初始化完成"); NoScopeLazyFalse noScopeLazyFalse = (NoScopeLazyFalse) ac.getBean("NoScopeLazyFalse"); }
单元测试结果
三、@Lazy与@Scope混用
1、测试@Lazy=true并且@Scope("singleton")。
测试类
1 @Configuration 2 public class ScopeSingletonleLazyTrue{ 3 @Bean 4 @Lazy 5 @Scope("singleton") 6 public ScopeSingletonleLazyTrue ScopeSingletonleLazyTrue(){ 7 System.out.println("向spring容器中添加ScopeSingletonleLazyTrue类"); 8 return new ScopeSingletonleLazyTrue(); 9 } 10 }
单元测试:
1 /** 2 * 测试条件:@Lazy=true @Scope("singleton") 3 * 测试期望结果:ScopeSingletonleLazyTrue在spring后加载 4 */ 5 @Test 6 public void ScopeSingletonleLazyTrueTest(){ 7 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ScopeSingletonleLazyTrue.class); 8 System.out.println("spring容器初始化完成"); 9 ScopeSingletonleLazyTrue scopeSingletonleLazyTrue = (ScopeSingletonleLazyTrue) ac.getBean("ScopeSingletonleLazyTrue"); 10 }
单元测试结果