Bean的作用域与Bean的实例化方式

139 阅读3分钟

Bean的作用域

默认情况下,SpringIOC容器创建的bean对象是单例的,且bean对象的创建是在初始化Spring上下文的时候完成的

在prototype(原型)情况下,bean对象的创建并没有发生在初始化Spring上下文的时候

在创建bean对象的时候可以指定scope作用域,一共包括8个作用域选项

  1. singleton:默认选项,单例模式
  2. prototype:原型模式,每调用一次getBean()方法都会获取一个新的bean对象或每次注入的时候都会创建一个新对象
  3. request:一个请求对应一个bean,仅限在web应用中使用
  4. session:一个会话对应一个bean,仅限在web应用中使用
  5. global session:portlet应用中专用的。如果在servlet应用中使用global session的话和session一个效果
  6. application:一个应用对应一个bean,仅限在web应用中使用
  7. websocket:一个websocket生命周期对应一个bean,仅限在web应用中使用
  8. 自定义scope

Bean的实例化方式

  1. 通过构造方法实例化
  2. 通过简单工厂模式实例化
  3. 通过factory-bean实例化
  4. 通过FactoryBean接口实例化

通过构造方法实例化,默认情况下,会调用bean的无参构造方法实例化

通过简单工厂模式实例化

  1. 定义一个Bean

  2. 编写简单工厂模式的工厂类,在工厂类中定义实例方法

    package com.wad.spring6.bean;
    /**
     * @author wad
     * @version 1.0
     * @className VipFactory
     * @since 1.0
     **/
    public class VipFactory {
        public static Vip get(){
            return new Vip();
        }
    }
    
    
  3. 在spring配置文件中指定factory-bean以及factory-method

    <bean id="vipBean" class="com.wad.spring6.bean.VipFactory" factory-method="get"/>
    

通过factory-bean实例化

这种方法的本质上是通过工厂方法模式进行实例化

  1. 定义一个bean

  2. 定义具体的工厂类

    
    /**
     * @author wad
     * @version 1.0
     * @className OrderFactory
     * @since 1.0
     **/
    public class OrderFactory {
        public Order get(){
            return new Order();
        }
    }
    
    
  3. 在Spring配置文件中指定factory-bean以及factory-method

    <bean id="orderFactory" class="com.wad.spring6.bean.OrderFactory"/>
    <bean id="orderBean" factory-bean="orderFactory" factory-method="get"/>
    

通过FactoryBean接口实例化

在以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自定义的。在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了,factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。

  1. 定义一个bean

    package com.wad.spring6.bean;
    
    /**
     * @author wad
     * @version 1.0
     * @className Person
     * @since 1.0
     **/
    public class Person {
    }
    
    
  2. 编写一个类实现FactoryBean接口

    package com.wad.spring6.bean;
    
    import org.springframework.beans.factory.FactoryBean;
    
    /**
     * @author wad
     * @version 1.0
     * @className PersonFactoryBean
     * @since 1.0
     **/
    public class PersonFactoryBean implements FactoryBean<Person> {
    
        @Override
        public Person getObject() throws Exception {
            return new Person();
        }
    
        @Override
        public Class<?> getObjectType() {
            return null;
        }
    
        @Override
        public boolean isSingleton() {
            // true表示单例
            // false表示原型
            return true;
        }
    }
    
    
  3. 在Spring配置文件中配置FactoryBean

<bean id="personBean" class="com.wad.spring6.bean.PersonFactoryBean"/>

FactoryBean在Spring中是一个接口。被称为“工厂bean”。“工厂bean”是一种特殊的bean。所有的“工厂bean”都是用来协助Spring框架来创建其他的bean对象的。

BeanFactory和FactoryBean的区别

BeanFactory

​ Spring Ioc容器的顶级对象,BeanFactory被翻译为“bean工厂”,在Spring的ioc容器中,“bean工厂”负责创建bean对象

FactoryBean

​ 是一个Bean,是一个能够辅助Spring实例化其他Bean对象的一个bean,在spring中,bean可以分为两类:普通bean,工厂bean(工厂bean也是一种bean,只不过这种bean比较特殊,它可以辅助Spring实例化其他的bean对象)