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容器的解析、管理bean定义以及处理依赖关系的能力。理解这一过程有助于我们更好地利用Spring框架,同时也能在需要时进行定制化开发。通过自定义配置,我们可以...
自定义标签本质上是一种封装了特定逻辑的JSP标签,它可以被重用,使得JSP页面的代码更加简洁、可读性更强。通过自定义标签,开发者可以将复杂的业务逻辑封装起来,避免在多个页面中重复编写相同的代码,同时也可以使...
4. **组件扫描**:如果Starter包含自定义的Spring Bean,可以使用`@ComponentScan`注解来指定需要扫描的包。 5. **自动配置测试**:为了确保Starter功能正常,通常会包含测试类,使用`@SpringBootTest`和其他Spring ...
**BeanDefinition** 是Spring框架中一个非常重要的概念,它本质上是用来描述一个Bean(即Java对象)的配置元数据。这些元数据包含了Bean的属性值、依赖关系、生命周期回调方法等信息。 - **定义了什么**:Bean...
List 可以使用 Collections.sort 方法进行排序,也可以自定义 Bean 实现 Comparable 接口或实现 Comparator 接口自定义比较器。 Java Map 集合中,我们常用的 Map 集合有 HashMap、HashTable、TreeMap、...
在EJB 3.0中,会话Bean本质上是一个Plain Old Java Object (POJO)类,这意味着它们的设计和实现更加简洁,易于理解和维护。 会话Bean的生命周期短暂,其存在时间依赖于客户端与会话Bean交互的时间长度。这种特性...
在 Spring 5.0.2 中,定制 Bean 的本质是指对 Bean 的自定义,包括 Bean 的定义、依赖关系和生命周期的管理。 6. Bean 定义继承 在 Spring 5.0.2 中,Bean 定义继承是指 Bean 的继承关系,包括 Bean 的父类和子类...
JSP页面本质上是通过Java Servlet引擎执行的。 ##### JSP基本语法 - **指令标识**: JSP提供了三种指令标识,分别为`page`、`include`和`taglib`。 - `page`: 定义JSP页面的行为和配置信息。 - `language`: 指定...
5. **Bean的Parcelable序列化**:在AIDL中传递复杂对象(如自定义bean)时,这些对象需要实现Parcelable接口以便于序列化和反序列化。例如,我们有一个名为`DataBean`的bean,它需要实现Parcelable接口。 ```java ...
Dubbo 和 Dubbox 本质上没有区别, Dubbox 是 Dubbo 的扩展版本,添加了更多的功能,如 REST 风格远程调用、基于 Kryo 和 FST 的 Java 高效序列化实现等。 三、ArrayList 和 LinkedList 的区别 ArrayList 和 ...
`Thread`类允许子类覆盖其`run()`方法以实现自定义的线程行为;而`ClassLoader`则可以被继承来自定义类加载机制。 #### 2. 抽象类与接口的区别 - **多重实现**:接口支持多重继承,而抽象类只支持单一继承。 - **...
- `${bean.name}` 或 `${bean['name']}`:用于访问JavaBean的属性,其中`bean.name`实质上是调用`bean.getName()`方法。 #### 二、EL的具体使用示例 下面通过一个简单的例子来展示如何在JSP页面中使用EL: ```jsp...
3. **JSP隐式对象与Servlet对应关系**:JSP的request、response等内置对象实质上是Servlet API中的对象。 **四、EL(Expression Language)** 1. **EL表达式**:简化了从JSP页面访问JavaBean属性的操作,如`${bean....
- **解决的问题**:JSF旨在解决Web开发中常见的问题,如处理HTTP无状态的本质、执行绪安全、数据验证和转换等复杂性,以及网页设计师与程序员之间工作流的分割。 - **特点**:隐藏了HTTP等底层细节,使得开发者能够...
- **JSR 303/JSR 349(Bean Validation)**:用于验证对象的属性,如@NotNull、@Size、@Email等。 - **Lombok**:提供如@Data、@AllArgsConstructor等注解,简化Java对象的构造和getter/setter生成。 5. **使用...
2. **Struts构建JAVA EE表示层**:深入Struts框架,包括ActionServlet、Action、ActionForm、JSP等组件的使用,以及Struts配置、自定义标记库、异常处理、国际化、EJB集成、Tiles库、日志机制、性能优化和测试等方面...
它们本质上是一组Maven或Gradle依赖,包含了启动特定功能所需的所有组件。通过在项目中引入这些Starter,开发者可以快速启用如数据访问、Web服务等特性,而无需手动添加和配置大量依赖。 **创建Starter的步骤:** ...