1bean有5种预定义作用域:
1.1singleton:请求都只会返回唯一的bean,传统的模式,要为每一个单独实例编写代码,spring以容器的功能直接提供单实例,很方便
应用:应为spring有面向切向的特点,所以DAO这些类都可以做成单实例模式
spring因为localThread和面向切向,使得非线程安全的类可以变成线程安全的类,因此默认作用域就是singleton.
1.2.prototype:每次请求都创建一个新的bean对象,所以spring初始化是不会实例化prototype这种bean的
1.3.request跟http请求对应,http中的request没了,作用域为request的bean也会被销毁
1.4.session 跟http请求对应,http中的session没了,作用域为session的bean也会被销毁
1.5.global session
2.代码演示singleton和prototye的区别
2.1目录结构
2.2代码目的,Boss类调用Car类的对象,不同配置会有不同结果
设置scope为prototype
<bean id="car" class="com.jike.spring.chapter04.scope.Car" scope="prototype"/>
那么每次都会创建一个新的Car()对象
设置scope为singleton或者不设置(默认为singleton)
<bean id="car" class="com.jike.spring.chapter04.scope.Car" scope="singleton"/>
那么每次都是调用的同一个Car()对象
2.3 Boss.java
package com.jike.spring.chapter04.scope; public class Boss { private String name ; private Car car; public Boss(){ } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String toString() { return "name:"+name+"\n car:"+car; } }
2.4 Car.java
package com.jike.spring.chapter04.scope; public class Car { private String color; private String brand; private double price; public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
2.5 Main.java
package com.jike.spring.chapter04.scope; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { //xml的文件路径名很重要,犯了一个错误,com.jike这种格式是错误的,一定要换成com/jike,把.换成/ BeanFactory beanFactory = new ClassPathXmlApplicationContext("com/jike/spring/chapter04/scope/conf-scope.xml"); Boss boss1 = beanFactory.getBean("boss1", Boss.class); Boss boss2 = beanFactory.getBean("boss2", Boss.class); Boss boss3 = beanFactory.getBean("boss3", Boss.class); System.out.println(boss1.getCar()); System.out.println(boss2.getCar()); System.out.println(boss3.getCar()); } }
2.6 scope-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="car" class="com.jike.spring.chapter04.scope.Car" scope="prototype"/><!--scope变成singleton,那么测试返回的就是同一个car对象 --> <bean id="boss1" class="com.jike.spring.chapter04.scope.Boss" p:car-ref="car" /> <bean id="boss2" class="com.jike.spring.chapter04.scope.Boss" p:car-ref="car" /> <bean id="boss3" class="com.jike.spring.chapter04.scope.Boss" p:car-ref="car" /> </beans>
2.7结果对比
设置为singleton
com.jike.spring.chapter04.scope.Car@1a5fe33 com.jike.spring.chapter04.scope.Car@1a5fe33 com.jike.spring.chapter04.scope.Car@1a5fe33
设置为prototype
com.jike.spring.chapter04.scope.Car@7740a2 com.jike.spring.chapter04.scope.Car@1a5fe33 com.jike.spring.chapter04.scope.Car@3108bc