组件注册 04 @Scope 设置组件作用域
参数详解
常用
prototype:多实例
singleton:单实例
不常用
request:同一次请求创建一个实例
session:同一个session创建一个实例
示例
单例模式(默认情况)
配置类
@Configuration
public class MainConfig2 {
// 由于容器中已经有了一个名为"person"的bean, 所以如果再注入"person"的时候会报错 需要修改下注入的bean的名称
// 不写scope的情况下 默认是singleton 相当于 @Scope("singleton")
@Bean("person2")
public Person person(){
return new Person("qd2",22);
}
}
测试
@Test
void scopeTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
Object bean = applicationContext.getBean("person2");
Object bean1 = applicationContext.getBean("person2");
System.out.println("bean :"+bean.toString());
System.out.println("bean1:"+bean1.toString());
System.out.println(bean == bean1);
}
多例模式
@Configuration
public class MainConfig2 {
// 由于容器中已经有了一个名为"person"的bean, 所以如果再注入"person"的时候会报错 需要修改下注入的bean的名称
@Bean("person2")
@Scope("prototype")
public Person person(){
return new Person("qd2",22);
}
}
等同于
<bean id="person" class="com.example.annotations.bean.Person" scope="prototype">
<property name="name" value="lxl"/>
<property name="age" value="21"/>
</bean>
测试结果:
Notes
单实例
单例模式下(singleton)
- 在容器加载的时候加载bean
- IOC容器启动会调用方法创建对象放进IOC容器中
- 以后每次获取直接从容器(map.get())中获取
多实例
多例模式下(prototype)
- IOC容器启动并不会调用方法创建对象放在容器中
- 每次获取的时候才会调用方法创建对象