Bean的作用域
默认情况下,SpringIOC容器创建的bean对象是单例的,且bean对象的创建是在初始化Spring上下文的时候完成的
在prototype(原型)情况下,bean对象的创建并没有发生在初始化Spring上下文的时候
在创建bean对象的时候可以指定scope作用域,一共包括8个作用域选项
- singleton:默认选项,单例模式
- prototype:原型模式,每调用一次getBean()方法都会获取一个新的bean对象或每次注入的时候都会创建一个新对象
- request:一个请求对应一个bean,仅限在web应用中使用
- session:一个会话对应一个bean,仅限在web应用中使用
- global session:portlet应用中专用的。如果在servlet应用中使用global session的话和session一个效果
- application:一个应用对应一个bean,仅限在web应用中使用
- websocket:一个websocket生命周期对应一个bean,仅限在web应用中使用
- 自定义scope
Bean的实例化方式
- 通过构造方法实例化
- 通过简单工厂模式实例化
- 通过factory-bean实例化
- 通过FactoryBean接口实例化
通过构造方法实例化,默认情况下,会调用bean的无参构造方法实例化
通过简单工厂模式实例化
-
定义一个Bean
-
编写简单工厂模式的工厂类,在工厂类中定义实例方法
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(); } } -
在spring配置文件中指定factory-bean以及factory-method
<bean id="vipBean" class="com.wad.spring6.bean.VipFactory" factory-method="get"/>
通过factory-bean实例化
这种方法的本质上是通过工厂方法模式进行实例化
-
定义一个bean
-
定义具体的工厂类
/** * @author wad * @version 1.0 * @className OrderFactory * @since 1.0 **/ public class OrderFactory { public Order get(){ return new Order(); } } -
在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()方法。
-
定义一个bean
package com.wad.spring6.bean; /** * @author wad * @version 1.0 * @className Person * @since 1.0 **/ public class Person { } -
编写一个类实现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; } } -
在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对象)