java web学习(进阶篇)二 Spring里的Bean

Bean

1 定义
bean对象是构成应用程序的支柱,它是一个被实例化,组装,并通
过 Spring IoC 容器管理的对象。这些 bean 由用容器提供的配置元数据创建。bean 定义包含称为配置元数据的信息,下述容器也需要知道配置元数据:
• 如何创建一个 bean
• bean 的生命周期详细信息
• bean 的依赖关系

上述所有的配置元数据转换成一组构成每个 bean 定义的下列属性:

属性 描述
class 强制性,指定用来创建 bean 的 bean 类
name 指定唯一的 bean 标识符
scope 指定由特定的 bean 定义创建的对象的作用域
constructor-arg 用来注入依赖关系
properties 用来注入依赖关系
autowiring mode 用来注入依赖关系
lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器当它第一次被请求而不是在启动时去创建一个 bean 实例。
initialization 方法 在 bean 所有必需的属性被容器设置后,调用回调方法
destruction 方法 包含该 bean 的容器被销毁时,使用回调方法。

2 Spring 配置元数据

Spring IoC 容器完全由实际编写的配置元数据的格式解耦。有三个重要的方法把配置元数据提供给 Spring
容器:
• 基于 XML 的配置文件。
• 基于注解的配置
• 基于 Java 的配置

3 Bean的作用域

在 Spring 中定义一个bean时,必须声明该 bean 的作用域。例如:

为强制 Spring 在每次需要时都产生新的 bean 实例,应声明 bean 的作用域的属性为 prototype,如果想让 Spring 在每次需要时都返回同一个bean实例,应声明 bean 的作用域属性为 singleton。

Spring 支持五个作用域,若使用 web-aware ApplicationContext 时,其中三个可用。

作用域 描述
singleton 将 bean 的定义的限制在每一个 Spring IoC 容器中的一个单一实例(默认)
prototype 将单一 bean 的定义限制在任意数量的对象实例
request 将 bean 的定义限制为 HTTP 请求。只在 web-aware Spring ApplicationContext 上下文中有效
session 将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext上下文中有效
global-session 将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 上下文中有效

4 Bean的生命周期

当bean被实例化时,需要执行一些初始化使它转换成可用状态,当 bean 不再需要,并从容器中移除时,需要做一些清除工作。在Bean实例化和销毁之间有一些其他的活动,这里只讨论两个重要的生命周期回调方法,它们在bean 的初始化和销毁时是必需的。

为了定义安装和拆卸一个 bean,只要声明带有 init-method 和/或 destroy-method 参数的 。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。destroy-method 指定一个方法,只有从容器中移除 bean 后,才能调用该方法。

初始化回调

基于 XML 的配置元数据下,使用 init-method 属性指定带有 void 无参数方法的名称。如:

<bean id="exampleBean"
class="examples.ExampleBean" init-method="init"/>

bean类的定义:

public class ExampleBean {
public void init() {
// do some initialization work
}
}

销毁回调

基于 XML 的配置元数据下,使用 destroy-method 属性指定带有 void 无参数方法的名称

<bean id="exampleBean"
class="examples.ExampleBean" destroy-method="destroy"/>

类的定义:

public class ExampleBean {
public void destroy() {
// do some destruction work
}
}

建议不要用 InitializingBean 或 DisposableBean 的回调方法,因为 XML 配置在命名方法上提供极大的灵活性。

默认的初始化和销毁方法

如果有太多同名的初始化或销毁方法的 Bean,不需要在每一个 bean 上声明初始化和销毁方法。使用元素中的 default-init-method 和 default-destroy-method 属性配置即可。

5 Bean 后置处理器

BeanPostProcessor 接口定义回调方法,可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等,也可以在 Spring 容器通过插入一个或多个 BeanPostProcessor 来完成实例化,配置和初始化一个bean之后实现一些自定义逻辑回调方法。

BeanPostProcessor 可对 bean(或对象)实例进行操作,这意味着 Spring IoC 容器实例化一个 bean 实例,然后BeanPostProcessor 接口进行它们的工作。

6 Bean 定义继承

bean定义可包含很多的配置信息,包括构造函数的参数,属性,容器信息。如初始化,静态工厂
方法名等。

子 bean 的定义继承父定义的配置数据。子定义根据需要可重写或添加一些值。

Spring Bean 的继承与 Java 类的继承无关,但继承的概念一样。可定义父 bean 作为模板,其他子 bean 就可从父 bean 中继承所需配置。

当使用基于 XML 的配置元数据时,通过使用父属性,指定父 bean 作为该属性的值来表明子 bean 的定义。

Bean 定义模板

可创建一个 Bean 定义模板,它可以很方便的被其他子 bean 定义使用。在定义一个 Bean 定义模板时,你不应指定类的属性,而应指定带 true 值的抽象属性。父 bean 自身不能被实例化,因为它是不完整和抽象的。

你可能感兴趣的:(java,spring,Web)