@Scope默认是单例模式,即scope="singleton"。另外scope还有prototype、request、session、global session作用域。scope="prototype"多例。
1、singleton 作用域
当一个bean的 作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
例子如下:
@Configuration
public class SpringConfig2 {
@Bean("person")
public Person person() {
return new Person();
}
}
public void test04() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig2.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
//默认是单实例的
Person person1 = (Person) applicationContext.getBean("person");
Person person2 = (Person) applicationContext.getBean("person");
System.out.println("person1==person2:"+(person1==person2));
}
测试结果如下:

2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
例子:指定scope="prototype" 属性;
@Configuration
public class SpringConfig2 {
@Scope("prototype")
@Bean("person")
public Person person() {
return new Person();
}
}
public void test04() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig2.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
Person person1 = (Person) applicationContext.getBean("person");
Person person2 = (Person) applicationContext.getBean("person");
System.out.println("person1==person2:"+(person1==person2));
}
测试结果如下:

注:
- prototype 多实例的 IOC容器启动的时候不会创建Bean,每次获取的时候才会去创建Bean
- singleton 单实例的 默认值 IOC容器启动就会调用方法创建Bean,以后每次就是直接从容器(map.get)中拿
- request 同一个请求创建一个实例(WEB环境)
- session 同一个session创建一个实例(WEB环境)
本文介绍了@Scope组件作用域,默认是单例模式(singleton),还有prototype、request、session、global session作用域。其中,singleton作用域在Spring IOC容器中只有一个共享实例;prototype作用域每次请求都会产生新实例,且Spring对其生命周期管理有限。还说明了不同作用域下Bean的创建时机。
527

被折叠的 条评论
为什么被折叠?



