`
anyeeye
  • 浏览: 145524 次
  • 来自: ...
社区版块
存档分类
最新评论

自定义bean的本质特征

阅读更多
3.4. 自定义bean的本质特征
3.4.1. 生命周期接口
Spring提供了一些标志接口,用来改变BeanFactory中的bean的行为。 它们包括InitializingBean和DisposableBean。 实现这些接口将会导致BeanFactory调用前一个接口的afterPropertiesSet()方法, 调用后一个接口destroy()方法,从而使得bean可以在初始化和析构后做一些特定的动作。

在内部,Spring使用BeanPostProcessors 来处理它能找到的标志接口以及调用适当的方法。 如果你需要自定义的特性或者其他的Spring没有提供的生命周期行为, 你可以实现自己的 BeanPostProcessor。关于这方面更多的内容可以看这里: 第 3.7 节 “使用BeanPostprocessors定制bean”。

所有的生命周期的标志接口都在下面叙述。在附录的一节中,你可以找到相应的图, 展示了Spring如何管理bean;那些生命周期的特性如何改变你的bean的本质特征以及它们如何被管理。

3.4.1.1. InitializingBean / init-method
实现org.springframework.beans.factory.InitializingBean 接口允许一个bean在它的所有必须的属性被BeanFactory设置后, 来执行初始化的工作。InitializingBean接口仅仅制定了一个方法:

    * Invoked by a BeanFactory after it has set all bean properties supplied

    * (and satisfied BeanFactoryAware and ApplicationContextAware).

    * <p>This method allows the bean instance to perform initialization only

    * possible when all bean properties have been set and to throw an

    * exception in the event of misconfiguration.

    * @throws Exception in the event of misconfiguration (such

    * as failure to set an essential property) or if initialization fails.

    */

    void afterPropertiesSet() throws Exception;注意:通常InitializingBean接口的使用是能够避免的(而且不鼓励,因为没有必要把代码同Spring耦合起来)。Bean的定义支持指定一个普通的初始化方法。在使用XmlBeanFactory的情况下,可以通过指定init-method属性来完成。 举例来说,下面的定义:

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



public class ExampleBean {

    public void init() {

        // do some initialization work

    }

}同下面的完全一样:

<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>



public class AnotherExampleBean implements InitializingBean {

    public void afterPropertiesSet() {

        // do some initialization work

    }

}但却不把代码耦合于Spring。

3.4.1.2. DisposableBean / destroy-method
实现org.springframework.beans.factory.DisposableBean接口允许一个bean, 可以在包含它的BeanFactory销毁的时候得到一个回调。DisposableBean也只指定了一个方法:

    /**

    * Invoked by a BeanFactory on destruction of a singleton.

    * @throws Exception in case of shutdown errors.

    * Exceptions will get logged but not rethrown to allow

    * other beans to release their resources too.

    */

    void destroy() throws Exception;

注意:通常DisposableBean接口的使用能够避免的(而且是不鼓励的,因为它不必要地将代码耦合于Spring)。 Bean的定义支持指定一个普通的析构方法。在使用XmlBeanFactory使用的情况下,它是通过 destroy-method属性完成。 举例来说,下面的定义:

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



public class ExampleBean {

    public void cleanup() {

        // do some destruction work (like closing connection)

    }

}同下面的完全一样:

<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>



public class AnotherExampleBean implements DisposableBean {

    public void destroy() {

        // do some destruction work

    }

}但却不把代码耦合于Spring。

重要的提示:当以portotype模式部署一个bean的时候,bean的生命周期将会有少许的变化。 通过定义,Spring无法管理一个non-singleton/prototype bean的整个生命周期, 因为当它创建之后,它被交给客户端而且容器根本不再留意它了。 当说起non-singleton/prototype bean的时候,你可以把Spring的角色想象成“new”操作符的替代品。 从那之后的任何生命周期方面的事情都由客户端来处理。BeanFactory中bean的生命周期将会在第 3.4.1 节 “生命周期接口” 一节中有更详细的叙述 .

分享到:
评论

相关推荐

    自定义标签学习笔记

    1. **自定义标签的本质**:本质上是一个简单的Java Bean,它可以用来封装业务逻辑或UI行为。 2. **自定义标签与JSP的关系**:自定义标签可以显著增强JSP的表现力,它将复杂的业务逻辑或者显示逻辑封装起来,使得...

    自定义spring控制反转(依赖注入)

    自定义Spring的控制反转和依赖注入,实质上是实现Spring容器的解析、管理bean定义以及处理依赖关系的能力。理解这一过程有助于我们更好地利用Spring框架,同时也能在需要时进行定制化开发。通过自定义配置,我们可以...

    Struts2自定义标签

    自定义标签本质上是一种封装了特定逻辑的JSP标签,它可以被重用,使得JSP页面的代码更加简洁、可读性更强。通过自定义标签,开发者可以将复杂的业务逻辑封装起来,避免在多个页面中重复编写相同的代码,同时也可以使...

    spring-boot-08-starter自定义.rar

    4. **组件扫描**:如果Starter包含自定义的Spring Bean,可以使用`@ComponentScan`注解来指定需要扫描的包。 5. **自动配置测试**:为了确保Starter功能正常,通常会包含测试类,使用`@SpringBootTest`和其他Spring ...

    spring源码学习

    **BeanDefinition** 是Spring框架中一个非常重要的概念,它本质上是用来描述一个Bean(即Java对象)的配置元数据。这些元数据包含了Bean的属性值、依赖关系、生命周期回调方法等信息。 - **定义了什么**:Bean...

    鹅厂面试题、大厂面试题、JVM面试题

    List 可以使用 Collections.sort 方法进行排序,也可以自定义 Bean 实现 Comparable 接口或实现 Comparator 接口自定义比较器。 Java Map 集合中,我们常用的 Map 集合有 HashMap、HashTable、TreeMap、...

    ejb 学习笔记

    在EJB 3.0中,会话Bean本质上是一个Plain Old Java Object (POJO)类,这意味着它们的设计和实现更加简洁,易于理解和维护。 会话Bean的生命周期短暂,其存在时间依赖于客户端与会话Bean交互的时间长度。这种特性...

    spring5.0.2中文官网文档.pdf

    在 Spring 5.0.2 中,定制 Bean 的本质是指对 Bean 的自定义,包括 Bean 的定义、依赖关系和生命周期的管理。 6. Bean 定义继承 在 Spring 5.0.2 中,Bean 定义继承是指 Bean 的继承关系,包括 Bean 的父类和子类...

    Jsp,JavaBean,Servlet组建一个mvc模式的登录界面

    JSP页面本质上是通过Java Servlet引擎执行的。 ##### JSP基本语法 - **指令标识**: JSP提供了三种指令标识,分别为`page`、`include`和`taglib`。 - `page`: 定义JSP页面的行为和配置信息。 - `language`: 指定...

    aidlDemo实例

    5. **Bean的Parcelable序列化**:在AIDL中传递复杂对象(如自定义bean)时,这些对象需要实现Parcelable接口以便于序列化和反序列化。例如,我们有一个名为`DataBean`的bean,它需要实现Parcelable接口。 ```java ...

    2023某厂面试题.doc

    Dubbo 和 Dubbox 本质上没有区别, Dubbox 是 Dubbo 的扩展版本,添加了更多的功能,如 REST 风格远程调用、基于 Kryo 和 FST 的 Java 高效序列化实现等。 三、ArrayList 和 LinkedList 的区别 ArrayList 和 ...

    j2ee面试

    `Thread`类允许子类覆盖其`run()`方法以实现自定义的线程行为;而`ClassLoader`则可以被继承来自定义类加载机制。 #### 2. 抽象类与接口的区别 - **多重实现**:接口支持多重继承,而抽象类只支持单一继承。 - **...

    EL表达式的使用

    - `${bean.name}` 或 `${bean['name']}`:用于访问JavaBean的属性,其中`bean.name`实质上是调用`bean.getName()`方法。 #### 二、EL的具体使用示例 下面通过一个简单的例子来展示如何在JSP页面中使用EL: ```jsp...

    jsp入门与提高(实用案例)

    3. **JSP隐式对象与Servlet对应关系**:JSP的request、response等内置对象实质上是Servlet API中的对象。 **四、EL(Expression Language)** 1. **EL表达式**:简化了从JSP页面访问JavaBean属性的操作,如`${bean....

    JSF入门精通超级好的教程

    - **解决的问题**:JSF旨在解决Web开发中常见的问题,如处理HTTP无状态的本质、执行绪安全、数据验证和转换等复杂性,以及网页设计师与程序员之间工作流的分割。 - **特点**:隐藏了HTTP等底层细节,使得开发者能够...

    annotation.rar

    - **JSR 303/JSR 349(Bean Validation)**:用于验证对象的属性,如@NotNull、@Size、@Email等。 - **Lombok**:提供如@Data、@AllArgsConstructor等注解,简化Java对象的构造和getter/setter生成。 5. **使用...

    精品专题(2021-2022年收藏)JavaEE企业培训方案.doc

    2. **Struts构建JAVA EE表示层**:深入Struts框架,包括ActionServlet、Action、ActionForm、JSP等组件的使用,以及Struts配置、自定义标记库、异常处理、国际化、EJB集成、Tiles库、日志机制、性能优化和测试等方面...

    手写一个Spring-Boot-Starter组件.zip

    它们本质上是一组Maven或Gradle依赖,包含了启动特定功能所需的所有组件。通过在项目中引入这些Starter,开发者可以快速启用如数据访问、Web服务等特性,而无需手动添加和配置大量依赖。 **创建Starter的步骤:** ...

Global site tag (gtag.js) - Google Analytics