在Spring中,组件作用域一般有如下几种(常用的只有前两种)
singleton 单实例
prototype 多实例
request 同一个请求创建一个实例
session 同一个session创建一个实例
global-session 同session作用域不同的是,所有的Session共享一个Bean实例
下面写个例子测试一下单例和多例模式
配置类
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import spring.Person;
@Configuration
public class MainConfig2 {
//默认是单实例
/*singleton 单实例
*prototype 多实例
*request 同一个请求创建一个实例
*session 同一个session创建一个实例
* */
@Bean(value="person")
@Scope(value="singleton")
public Person person() {
return new Person("chd", "18");
}
}
Test测试类
package chd.test;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import config.MainConfig2;
public class Test2 {
@Test
public void Test() {
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig2.class);
String []arr=applicationContext.getBeanDefinitionNames();
for (String name : arr) {
System.out.println(name);
}
Object bean= applicationContext.getBean("person");
Object bean2= applicationContext.getBean("person");
System.out.println(bean==bean2);
}
}
单例模式下@Scope(value=“singleton”),创建两个bean的结果
多例模式@Scope(value=“prototype”)下结果
(说明创建了两个bean实例)
那么单例模式和多例模式下,Ioc容器创建其过程是一样的吗?
单例模式
@Bean(value="person")
@Scope(value="singleton")
public Person person() {
//容器调用此类输出一下语句
System.out.println("给容器中注册bean类...");
return new Person("chd", "18");
结果如下,说明容器创建过的过程,调用此方法创建bean对象放入容器之中
在多例模式之下,则不会先调用此方法,意味着容器没有创建对象到容器之中
那么在多例模式下,什么时候会创建实例呢?
在测视类中,获取bean对象(每次调用的时候则会创建对应实例)
@Test
public void Test() {
AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(MainConfig2.class);
System.out.println("ioc容器创建完成...");
Object bean= applicationContext.getBean("person");
Object bean2= applicationContext.getBean("person");
}
总结一下
单实例:ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就是直接从容器中拿。
多实例:ioc容器并不会调用方法创建对象放入容器之中,每次获取的时候才会调用方法创建对象。