Spring注解[email protected]、@Lazy的使用
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,都会创建不同的实例。
上一篇: 边缘检测的GUI设计
下一篇: Matlab用不同公式计算Π值
推荐阅读
-
Spring @Component 注解的使用
-
spring注解@Service注解的使用
-
spring注解@Service注解的使用
-
使用 Spring 2.5 基于注解驱动的 Spring MVC
-
spring boot中关于获取配置文件注解的使用@ConfigurationProperties、@Value、@PropertySource
-
Spring注解开发—— 5、组件注册[email protected]设置组件作用域
-
Spring注解开发——2、组件注册[email protected]&@Bean给容器中注册组件
-
Spring注解开发——7、组件注册[email protected]按照条件注册bean
-
spring注解:@Value在使用中遇到的问题
-
使用Spring开启注解AOP的支持放置的位置