Springboot注解 - @Lazy和@Scope

springboot注解说明:

  1. 默认情况下 spring 容器中都是单实例。
  2. @Lazy注解
    1. value=false:默认在容器启动的时候创建对象
    2. value=true:懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化  
  3. @Scope注解
    1. prototype:多例。IOC容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象;
    2. 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     }

 

     单元测试结果

 

 

 

 

 

 

  

posted @ 2020-03-23 13:38  黑夜中的亮光  阅读(1108)  评论(0编辑  收藏  举报