@Scope
@Scope:设置Bean的作用域
@Configuration
public class MainConfig02 {
/**
* * @Scope:调整作用域
* * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
* * 每次获取的时候才会调用方法创建对象;
* * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
* * 以后每次获取就是直接从容器(map.get())中拿,
* * request:同一次请求创建一个实例
* * session:同一个session创建一个实例
*/
@Scope("singleton")
@Bean("person")
public Person person(){
System.out.println("创建Person对象并放入IOC容器");
return new Person("lishi",20);
}
}
单实例下获取到的组件是同一个
@Test
public void test02(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig02.class);
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
Object person1 = applicationContext.getBean("person");
Object person2 = applicationContext.getBean("person");
//@Scope("singleton") true
//@Scope("prototype") false
System.out.println(person1==person2);
}
单实例-饿汉式:单实例加载配置文件,控制台会打印容器中放入了Person对象
多实例-懒汉式:多实例加载配置文件,控制台不打印,只有等到用到时才加载组件
@Test
public void test02(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig02.class);
//@Scope("singleton") 打印 创建Person对象并放入IOC容器
//@Scope("prototype") 不打印
}