Appearance
作用域
单例模式
- 在ioc容器初始化时创建,有且只有一个
- 如果不配置,默认就是单例模式
多例模式
在获取bean时创建,会有多个
测试多例和单例
- Factory.java
java
package com.wyizd.scope;
import java.util.ArrayList;
import java.util.List;
public class Factory {
private List<Order> orderList = new ArrayList<>();
public void reciveOrder(Order order){
orderList.add(order);
}
public void inventory(){
for (Order order : orderList) {
System.out.println(order);
}
}
}
- Order.java
java
package com.wyizd.scope;
import java.time.LocalTime;
public class Order {
private Integer id;
private LocalTime createTime;
public void setId(Integer id) {
this.id = id;
}
public void setCreateTime(LocalTime createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Order{" +
"id='" + id + '\'' +
", createTime=" + createTime +
'}';
}
}
- scope.xml
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.wyizd.scope.Order" scope="prototype"/>
<bean class="com.wyizd.scope.Factory" />
</beans>
- 测试类 Test.java
java
package com.wyizd.scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("scope.xml");
Factory factory1 = context.getBean(Factory.class);
Factory factory2 = context.getBean(Factory.class);
for (int i = 0; i <10; i++) {
TimeUnit.MICROSECONDS.sleep(100);
Order order = context.getBean(Order.class);
order.setId(i);
order.setCreateTime(LocalTime.now());
factory1.reciveOrder(order);
}
factory2.inventory();
}
}
- 总结:
- factroy1接受了订单,但是factory2可以盘点订单,所以,factory1==factory2
- 每个order的订单id不同,是不同的对象,属于多例模式
request
- 在一个请求范围内有效
session
- 在一个会话范围内有效