【Bean的作用域:singleton;prototype;WEB环境作用域】
【singleton】
beans-scope.xml:
1 <!-- 2 使用bean的scope属性来配置bean的作用域 3 singleton:默认值,容器初始化时创建bean实例,在整个容器的生命周期内只创建这一个bean,单例的。 4 --> 5 <bean id="car" class="com.hk.beans.autowire.Car" scope="singleton"> 6 <property name="brand" value="Audi"></property> 7 <property name="price" value="300000"></property> 8 </bean>
Main.java:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); 4 Car car = (Car) ctx.getBean("car"); 5 Car car2 = (Car) ctx.getBean("car"); 6 System.out.println(car == car2); 7 } 8 }
运行结果:
注释掉测试方法中的4,5,6行代码:
Main.java:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); 4 // Car car = (Car) ctx.getBean("car"); 5 // Car car2 = (Car) ctx.getBean("car"); 6 // System.out.println(car == car2); 7 } 8 }
运行结果:
说明:在我们创建容器的时候,这个bean已经被初始化好了。下次我们从容器中获取bean的时候都会返回这个已经创建好的bean。
【prototype(原型的)】
beans-scope.xml:
1 <bean id="car" class="com.hk.beans.autowire.Car" scope="prototype"> 2 <property name="brand" value="Audi"></property> 3 <property name="price" value="300000"></property> 4 </bean>
注释掉测试方法中的4,5,6行代码:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); 4 // Car car = (Car) ctx.getBean("car"); 5 // Car car2 = (Car) ctx.getBean("car"); 6 // System.out.println(car == car2); 7 } 8 }
运行结果:
没有创建任何bean。
当把Car car = (Car) ctx.getBean("car");的代码加上时,运行结果如下:
当把Car car2 = (Car) ctx.getBean("car");代码加上时,运行结果:
把System.out.println(car == car2);代码加上,运行结果如下:
说明:容器初始化时,不创建bean的实例,而在每次请求时都创建一个新的bean实例并返回。
在struts2和Spring整合时,在struts的action的那个地方用的较多。