作用域:
singleton:单例,整个应用中只创建一个实例(默认)
prototype:原型,每次注入时都新建一个实例
session:会话,每个会话创建一个实例
request:请求,每个请求创建一个实例
默认情况下,bean都是单例的,在下面这样时初始化,调用各个bean的构造函数
1 <bean id="person" class="com.guigu.spring.autowire.Person" 2 p:name="Tom" ></bean> 3 //相当于: 4 <bean id="person" class="com.guigu.spring.autowire.Person" 5 p:name="Tom" scope="singleton"></bean>
1 ApplicationContext ctx = new ClassPathXmlApplicationContext("scope.xml"); //这里初始化,调用bean的构造函数 2 Person person1 = (Person) ctx.getBean("person"); 3 Person person2 = (Person) ctx.getBean("person"); 4 system.out.println(person1 == person2); //结果:true
在第一行时,就调用了构造函数,实例化了对象,并且只有一个对象。 person1 和person2其实是同一个对象
若是原型:
1 <bean id="person" class="com.guigu.spring.autowire.Person" 2 p:name="Tom" scope="prototype"></bean>
同样,两次调用,结果会是false
1 ApplicationContext ctx = new ClassPathXmlApplicationContext("scope.xml"); //这里初始化,但此时不创建实例 2 Person person1 = (Person) ctx.getBean("person"); 3 Person person2 = (Person) ctx.getBean("person"); 4 system.out.println(person1 == person2); //结果:false
prototype规定,容器初始化时,不会自动创建实例,而是调用它时才创建。调用了两次,就创建了两个实例。
session:在一哥session会话中,是同一个bean,不同session就是不同bean
request:每一个HTTP请求生成一个新的bean