源码:https://github.com/nieandsun/spring-study 1.@Scope
注意:
(1) spring默认情况下创建对象是单实例的
(2) 单实例:创建IOC容器的时候实例bean就被创建了
(3)多实例: 仅当bean被使用的时候才创建
主要用法如下:
@Configuration
public class C06Config1 {
/**
* 没有@Scope/有@Scope后面什么都不写/或 @Scope("singleton"):
* 单实例(默认)---IOC容器启动的时候会调用方法创建对象并放到IOC容器中,
* 以后每次获取的就是直接从容器中拿(大Map.get)的同一个bean
*
* prototype:
* 多实例---IOC容器启动的时候,IOC容器启动并不会去调用方法创建对象,
* 而是每次获取的时候才会调用方法创建对象
*
*
* request: 主要针对web应用, 递交一次请求创建一个实例
*
* session:同一个session创建一个实例
*
* @return
*/
@Bean
// @Scope(value = "singleton") //这样也可以
@Scope("singleton")
public Cup06 cup06() {
return new Cup06();
}
}
2.@Lazy
注意:
懒加载针对的是单实例bean懒加载只是容器启动的时候不会创建对象,而是第一次被使用的时候进行创建
但当对象创建完成后,就和非懒加载的bean一样都被放到spring容器里了,之后再使用就和其他单实例bean一样直接去spring容器中去拿了
测试用例即结论如下:
- 配置类
@Configuration
public class C06Config2 {
/**
* 非懒加载: 主要针对单实例bean,默认在容器启动的时候创建对象
*
* 懒加载:容器启动时候不创建对象, 仅当第一次使用(获取)bean的时候才创建被初始化
* 之后就和其他单实例bean一样直接去spring容器中去拿了
* @return
*/
@Bean
//@Lazy(value = false)
@Lazy(false)
//@Lazy
public Cup06 cup06() {
System.out.println("向spring容器中添加cup06类");
return new Cup06();
}
}
- 启动类
@Test
public void test02() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(C06Config2.class);
System.out.println("spring容器初始化完成");
Cup06 cup061 = (Cup06) ac.getBean("cup06");
}
如果有@Lazy或@Lazy(true)或@Lazy(value = true)时运行结果如下:
如果没有@Lazy或者@Lazy(false)或者@Lazy(value = false)时运行结果: