Spring注解--@Scope、@Lazy的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fangxinde/article/details/82749972

1.Spring容器创建bean时,默认为单实例模式(@Scope的属性值为singleton) ,同时可配合@Lazy使用

1)@Scope属性值为默认值singleton时,构建实例的方法没有@Lazy注解修饰时,何时创建bean?

     容器一旦启动,就开始创建bean.

 
 
@Configuration
public class MainConfig2 {
	 @Scope 
	 @Bean(value="person")
	public Person person(){
		 System.out.println("给容器中添加Person....");
		 return new Person("Lily",18);
	}
}

 测试用例中:案例中只有启动容器功能,没有引用bean实例功能

	 @Test 
	public void test02(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
		 System.out.println("ioc容器创建完成......");
  		//Person bean = (Person)applicationContext.getBean("person");	 
 		//Person bean2 = (Person)applicationContext.getBean("person");
 
 	        //System.out.println(bean==bean2);
	}

测试结果为:

     给容器中添加Person....
      ioc容器创建完成......

由运行结果可知,容器一旦启动,就创建了Person实例

2)@Scope属性值默认值为singleton时,且有@lazy修饰,何时创建bean?

第一次引用该bean时,创建bean

配置类中方法person()被@Lazy修饰,表示懒加载,

@Configuration
public class MainConfig2 {
	 @Scope 
         @Lazy
	 @Bean(value="person")
	public Person person(){
		 System.out.println("给容器中添加Person....");
		 return new Person("Lily",18);
	}
}

测试案例中:只有启动容器的功能

	 @Test 
	public void test02(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
		 System.out.println("ioc容器创建完成......");
  		//Person bean = (Person)applicationContext.getBean("person");	 
 		//Person bean2 = (Person)applicationContext.getBean("person");
 
 	        //System.out.println(bean==bean2);
	}

测试案例:运行结果==>ioc容器创建完成......

可知配置类中的person()方法未执行,没有创建Person对象,创建的对象出现延迟(相比启动容器,就创建bean)。这就是@Lazy的作用

一当取消测试案例中注释,测试案例中有引用bean功能:

 @Test 
	public void test02(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
		 System.out.println("ioc容器创建完成......");
  		Person bean = (Person)applicationContext.getBean("person");	 
 		Person bean2 = (Person)applicationContext.getBean("person");
                //判断容器创建的bean是否为同一个bean
 	        System.out.println(bean==bean2);
	}

测试案例的运行结果为:

ioc容器创建完成......
给容器中添加Person....
true

一旦引用bean时,就开始实例化bean.

通过容器两次获取的bean、bean2,进行比较,其值为true。说明每次引用的bean为同一实例,也就体现出 @Scope的值为singleton时,容器在生命周期内只创建一个bean实例。

2.@scope属性值为prototype时,容器何时创建bean?

      引用bean时,创建bean实例

配置类中person()方法被 @Scope("prototype")注解修饰时,表示容器实行多实例模式创建bean.

每次引用bean都得重新创建一个新bean

@Configuration
public class MainConfig2 {
	 @Scope("prototype")
	 @Bean(value="person")
	public Person person(){
		 System.out.println("给容器中添加Person....");
		 return new Person("Lily",18);
	}
}

测试案例:案例中只有启动容器的功能

        @Test 
	public void test02(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
		 System.out.println("ioc容器创建完成......");
  		//Person bean = (Person)applicationContext.getBean("person");	 
 		//Person bean2 = (Person)applicationContext.getBean("person");
                //判断容器创建的bean是否为同一个bean
 	        //System.out.println(bean==bean2);
	}

 运行结果:ioc容器创建完成......

启动容器,但未创建bean。

删除测试中的注释,运行测试案例,引用bean时,创建bean实例。获取bean、bean2进行比较,其值为false.说明容器创建了两个不同bean实例。也体现了@Scope值为prototype时,容器在生命周期内,每次引用bean,都会创建不同的实例。

猜你喜欢

转载自blog.csdn.net/fangxinde/article/details/82749972