总结
@Scope:调整作用域
- 默认是单例的
- prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中,
每次获取的时候才会调用方法创建对象; - singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中,
以后每次获取就是直接从容器(map.get())中拿; - request:同一次请求创建一个实例;
- session:同一个session创建一个实例;
1.IOC容器中添加组件默认都是单实例的,
所以无论获取多少次都是容器启动时new Person(“张三”, 25);这个对象
public class MainConfig2020 {
@Bean("person")
public Person person(){
//1.容器启动时就被调用创建了对象
System.out.println("给容器中添加Person....");
return new Person("张三", 25);
}
}
测试会发现 :
1.容器启动时就被调用创建了对象
2.多次调用getBean得到的是同一个对象(单例)
@Test
public void test2020(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2020.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
System.out.println("ioc容器创建完成....");
Object bean = applicationContext.getBean("person");
Object bean2 = applicationContext.getBean("person");
System.out.println(bean == bean2); //true
}
2.那如何改变这一规则呢? @Scope(“prototype”)
@Scope注解内部
测试会发现
1.容器启动时并没有被调用创建
2.在执行测试类test2020()时getBean(“person”)了几次就调用创建几次
/**
* @Scope注解可使用的参数:
* @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION sesssion
*/
@Scope("prototype")
public class MainConfig2020 {
@Bean("person")
public Person person(){
//1.容器启动时并没有被调用创建
//2.在执行测试类test2020()时getBean("person")了几次就调用创建几次
System.out.println("给容器中添加Person....");
return new Person("张三", 25);
}
}
@Test
public void test2020(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2020.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
System.out.println("ioc容器创建完成....");
Object bean = applicationContext.getBean("person");
Object bean2 = applicationContext.getBean("person");
System.out.println(bean == bean2); //false
}
等价于xml配置中 scope=“prototype”
<bean id="personddd" class="com.rensh.bean.Person" scope="prototype" >
<property name="age" value="18"></property>
<property name="name" value="zhangsan"></property>
</bean>
总结
@Scope:调整作用域
- 默认是单例的
- prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
每次获取的时候才会调用方法创建对象; - singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
以后每次获取就是直接从容器(map.get())中拿, - request:同一次请求创建一个实例
- session:同一个session创建一个实例