欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring注解[email protected]、@Lazy的使用

程序员文章站 2022-05-21 22:20:24
...

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实例。

[email protected]属性值为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,都会创建不同的实例。