Spring Bean 简介

什么是 Bean

Spring 中 Bean 是由 Spring IoC 容器实例化、管理、组装的 Java 对象。

官方定义:In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

每个 Bean 对应一个 Java 类的实例,由 Spring 容器(BeanFactory)集中管理。

Bean 生命周期

从 Spring 容器启动到容器销毁 Bean 的全过程,包括以下一系列流程:

  1. 实例化 BeanFactoryPostProcessor 实现类
  2. 执行 BeanFactoryPostProcessor 的 postProcessBeanFactory() 方法
  3. 实例化 BeanPostProcessor 实现类
  4. 实例化 InstantiationAwareBeanPostProcessor 实现类
  5. 执行 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation() 方法
  6. 执行 Bean 构造器,实例化 Bean
  7. 执行 InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation() 方法
  8. 执行 InstantiationAwareBeanPostProcessor 的 postProcessPropertyValues() 方法
  9. 注入 Bean 的属性值
  10. 调用 BeanNameAware 的 setBeanName() 方法
  11. 调用 BeanFactoryAware 的 setBeanFactory() 方法
  12. 执行 BeanPostProcessor 的 postProcessBeforeInitialization() 方法
  13. 调用 InitializingBean 的 afterPropertiesSet() 方法
  14. 调用 Bean 的 init-method 属性指定的初始化方法
  15. 执行 BeanPostProcessor 的 postProcessAfterInitialization() 方法
  16. Bean 交给调用者使用
    a. Singleton 的 Bean 在缓存池中
    b. Prototype 的 Bean 使用新的实例
  17. 调用 DiposibleBean 的 destory() 方法
  18. 调用 Bean 的 destory-method 属性置顶的销毁方法

以上的流程可以看到 Bean 的生命周期分为两部分:

a. 容器全局的控制:BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessor
b. Bean 自身的初始化和销毁方法:init-method、destory-method、BeanNameAware、BeanFactoryAware、BeanPostProcessor、InitializingBean、DiposibleBean

Bean 作用域

Spring bean 可以分为5个作用域,由 @Scope() 指定:

  • singleton:默认的作用域,不管接受到多少个请求,每个容器中只有一个 Bean 实例,单例的模式由 BeanFactory 来维护。
  • prototype:与单例模式相反,为每一个 Bean 请求提供一个新的实例。
  • request:每次 Http 轻轻都会创建一个新的 Bean,仅适用于 WebApplicationContext。在请求完成以后,Bean 会失效并被垃圾回收器回收。
  • session:同一个 Http Session 共享一个 Bean,仅适用于 WebApplicationContext。在 Session 过期后,Bean 会失效并被垃圾回收器回收。
  • global-session:同一个全局 Session 共享一个 Bean,仅适用于 WebApplicationContext,一般用于 Portlet 环境。

其他特性

Inner Bean

类似于 Java 内部类,Inner Bean 定义在其他 Bean 内部。

<bean id = "outerBean" class = "...">
  <property name = "xxx">
     <bean id = "innerBean" class = "..."/>
  </property>
</bean>

Inner bean 可以用 setter 注入“属性”和构造方法注入“构造参数”的方式来实现。

线程安全

通常 Bean 是无状态的,即可以认为是线程安全的。否则,Spring Bean 的线程安全于 Bean 的作用域相关。

  • 对于 Singleton Bean 不是线程安全的(Bean 是有状态的),
  • 对于 Prototype Bean 是线程安全的,因为是非线程共享的

自动装载

在配置文件中(或注解的方式)可以设定 Bean 的依赖关系,容器可以自动装配 Bean 之间的关联关系。

下面的 XML 配置文件表明了如何根据名称将一个 Bean 设置为自动装配:

<bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" />

还可以使用 @Autowired 注解来自动装配指定的 Bean:

@Autowired
public EmployeeDAOImpl(EmployeeManager manager ) {
    this.manager = manager;
}

Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

5 × 3 =