1.Bean的作用域种类
Spring中的bean的作用域分为四种:singleton、prototype、session、request,后两种很少使用,下面我们主要来学习前两种
2.singleton单例模式
在Spring种我们可以通过bean标签中的scope属性对Bean的作用域进行设置,singleton是默认值,容器初始时创建bean实例,在整个容器的生命周期内只创建一这一个bean,是单例的,在程序种无论获取多少次这个bean返回的都是同一个bean,并且在容器启动的时候就会创建。
1)验证bean是否是单例的
首先配置一个singleton作用域的bean
1 <bean id="car" class="com.wzy.autowire.Car" scope="singleton"> 2 <property name="brand" value="AUDI"/> 3 <property name="price" value="300000"/> 4 </bean>
执行java测试类:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); 4 5 Car car = (Car) ctx.getBean("car"); 6 Car car2 = (Car) ctx.getBean("car"); 7 8 System.out.println(car == car2); 9 } 10 }
执行结果:
我们可以看到打印了执行了Car的构造方法,并且两个对象的引用时相等的,说明使用singleton模式多次返回的bean是同一个。
2)验证单例模式的bean是否在IOC容器启动时就被创建
在不改变配置文件的情况下,我们只执行下面一行代码:
1 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
输出结果:
根据输出结果我们可以观察到,我们没有去getBean,但是Car的构造方法还是执行,说明在IOC容器启动时,就将单例的对象创建好,当程序中需要这个bean直接将创建好的bean推送给程序。
3.prototype原型模式(即多例模式)
原型模式是经常使用的一种bean作用域,使用prototype作用域,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的Bean实例,并返回。
1)验证bean是否是多例的
spring配置文件配置一个多例的bean:
1 <bean id="car" class="com.wzy.autowire.Car" scope="prototype"> 2 <property name="brand" value="AUDI"/> 3 <property name="price" value="300000"/> 4 </bean>
我们同样来执行之前那段Java的测试代码:
public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); Car car = (Car) ctx.getBean("car"); Car car2 = (Car) ctx.getBean("car"); System.out.println(car == car2); } }
执行结果:
通过输出的结果我们可以观察到,两次获取bean的引用并不相等,说明并不是同一个bean,并且调用了两次构造方法,说明创建了两个Car类的对象。
2)验证prototype模式的bean在容器启动时是否创建
我们在不改变spring配置的情况下,只执行下面一行代码:
1 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
执行结果:
我们可以观察到,控制台上没有任何输出,所以我们可以得出结论,prototype模式下bean是在获取时才创建,而不是在IOC容器启动时创建的。