Skip to content

作用域

单例模式

  • 在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

  • 在一个会话范围内有效