第4小节:@Scope组件
写一个新的配置类:
@Configuration
public class MainConfig2 {
@Bean(“person”)
public Person person(){
return new Person(“xy”,12);
}
}
编写一个测试类:
public void IOCTest02() {
//指定配置类所在的位置,返回ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
//查看该容器中有哪些bean
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
//根据id获取bean
//在ioc容器中,组件默认都是单实例的
Object bean=applicationContext.getBean(“person”);
Object bean1=applicationContext.getBean(“person”);
System.out.println(bean==bean1);
}
测试结果:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig2
person
true———默认组件都是单实例,所以获取到的第一次和第二次获取到的对象是一致的
可以借助@Scope注解改变ioc实例化对象的作用范围
在配置类中的实例化方法上添加注解:@Scope(“prototype”)
@Configuration
public class MainConfig2 {
@Scope(“prototype”)
@Bean(“person”)
public Person person(){
return new Person(“xy”,12);
}
}
测试类不变
测试结果:
false ——两次获取实例时获取到的不是同一个实例对象
@scope的取值主要有四种:
prototype:多实例的 :ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法去创建对象
Singleton:单实例的(默认值:ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接从容器中拿(从map中get一个实例)
request: 同一次请求创建一个实例 ———web环境下
session:同一个session创建一个实例 ———web环境下
测试:ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接从容器中拿(从map中get一个实例)
首先在配置类中将@Scope的值指定为默认值
@Configuration
public class MainConfig2 {
@Scope(“prototype”)
@Bean(“person”)
public Person person(){
System.out.println(“给容器中添加person…”);
return new Person(“xy”,12);
}
}
编写测试类:
在该类中只是获取容器,不使用获取到的实例对象:
@Test
public void IOCTest02() {
//指定配置类所在的位置,返回ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
}
测试结果:给容器中添加person…
容器一启动就创建了该实例对象,以后每次使用是在一个map集合中get这个实例对象,每次都是同一个
测试多实例的加载时间:
在配置中将@Scope的属性值指定为prototype
@Configuration
public class MainConfig2 {
@Scope(“prototype”)
@Bean(“person”)
public Person person(){
System.out.println(“给容器中添加person…”);
return new Person(“xy”,12);
}
}
编写测试类:
@Test
public void IOCTest02() {
//指定配置类所在的位置,返回ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
}
测试结果: (无)
测试:ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法去创建对象
测试类2:
@Test
public void IOCTest02() {
//指定配置类所在的位置,返回ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
//根据id获取bean
//在ioc容器中,组件默认都是单实例的
System.out.println(“ioc容器创建完成。。。”);
Object bean=applicationContext.getBean(“person”);
}
测试结果:
ioc容器创建完成。。。
给容器中添加person…
也就是,当需要使用到实例时再调用实例方法去创建实例对象
若是多次获取:
测试类3:
@Test
public void IOCTest02() {
//指定配置类所在的位置,返回ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
//根据id获取bean
//在ioc容器中,组件默认都是单实例的
System.out.println(“ioc容器创建完成。。。”);
Object bean=applicationContext.getBean(“person”);
Object bean1=applicationContext.getBean(“person”);
}
测试结果:
ioc容器创建完成。。。
给容器中添加person…
给容器中添加person…
也就是,获取几次实例对象就会调用几次实例方法去创建实例