在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean由Spring IoC容器实例化,组装和管理的对象,它只是应用程序中许多对象之一。Bean与bean之间的依赖关系反映在容器使用的配置元数据中。

一、bean的定义

Spring IoC容器管理一个或多个bean,这些bean是根据配置的参数创建的(例如,在XML中以<bean> <bean/>d的形式定义。这些bean定义主要包括以下元数据:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="configLocation" value="classpath:mybatis-config.xml" />

<property name="dataSource" ref="dataSource" />

<property name="mapperLocations" value="classpath*:mapper/*.xml"/>

</bean>

spring中的bean是什么(为什么说它是spring应用程序的主干)(1)

bean的定义

除了包含有关如何创建特定bean的信息的bean定义之外,这些ApplicationContext实现还允许注册在容器外部(由用户)创建的现有对象。这是通过方法访问ApplicationContext的BeanFactory来完成的getBeanFactory(),该方法返回BeanFactory DefaultListableBeanFactory实现。DefaultListableBeanFactory 通过registerSingleton(..)和 registerBeanDefinition(..)方法支持此注册。

每个bean都有一个或多个标识符。这些标识符在托管bean的容器中必须是唯一的。bean通常只有一个标识符。在基于XML的配置元数据中,可以使用id属性、name属性或两者来指定bean标识符。通常,这些名称是字母数字('myBean','someService'等),但它们也可以包含特殊字符。如果要为bean引入其他别名,还可以在name 属性中指定它们,用逗号、分号或空格分隔。

二、bean的实例化

可以将bean理解为用于创建一个或多个对象的配方。容器在被请求查看命名bean的配方时,可以使用该bean定义封装的配置元数据来创建(或获取)实际对象。如果使用基于XML的配置bean元数据的,创建class属性对应类的实例化的对象。实例化bean对象的方法有两种:

1)使用构造函数实例化

通过构造方法创建bean时,所有普通类都可以使用并与Spring兼容。spring IoC容器可以管理真正的JavaBeans,几乎可以管理任何类。spring通过默认构造函数,创建bean实例,类似于new一个对象。

2)使用静态工厂方法实例化

定义使用静态工厂方法创建的bean时,可以使用class 属性指定包含static方法的工厂类,并通过使用factory-method名称的属性指定工厂方法创建bean实例。如下,通过使用ClientService工厂的createInstance() 静态方法创建bean实例。

<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/> public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; } }

三、Bean范围

可以通过配置创建的对象的范围,而不必在Java类中限制对象的范围。Spring Framework支持六个范围:1)singleton,将单个bean定义范围限定为每个Spring IoC容器的单个对象实例。2)prototype,将单个bean定义范围限定为任意数量的对象实例。3)request,将单个bean定义范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅在具有Web感知功能的Spring环境中有效ApplicationContext。4)session,将单个bean定义范围限定为HTTP的生命周期Session。仅在具有Web感知功能的Spring环境中有效ApplicationContext。5)application,将单个bean定义范围限定为a的生命周期ServletContext。仅在具有Web感知功能的Spring环境中有效ApplicationContext。6)websocket,将单个bean定义范围限定为WebSocket的生命周期。

spring中的bean是什么(为什么说它是spring应用程序的主干)(2)

singleton

spring中的bean是什么(为什么说它是spring应用程序的主干)(3)

prototype

四、bean生命周期回调

与管理bean的生命周期的容器进行交互,可以实现Spring InitializingBean和DisposableBean接口,对bean的创建和销毁进行管理。Spring Framewor可以k使用BeanPostProcessor来实现任何回调接口并调用适当的方法。除了初始化和销毁​​回调之外,Spring管理的对象还可以实现Lifecycle接口,以便这些对象可以参与启动和关闭过程,这是由容器自身的生命周期驱动的。

spring中的bean是什么(为什么说它是spring应用程序的主干)(4)

bean初始化回调

spring中的bean是什么(为什么说它是spring应用程序的主干)(5)

bean的回收

,