Java实现组件的生命周期
假如你在写平台或者一个比较大的项目,总会设计到多个模块,模块有大有小,往往模块之前是嵌入式(embbed)的,即小模块由大模块来管理,外层模块控制着里层模块。这时我们为这些组件设计一套通用的生命周期机制会是一种很好的实现方法,既加强了代码的组织也降低了维护的代价。
首先要实现一套生命周期机制需要哪些类呢?
- LifeCycle:代表生命周期
- LifeCycleState:代表生命周期状态
- LifeCycleEvent、LifeCycleListener:当状态改变时需要告诉监听者(监听器模式)
- LifeCycleException: 异常
定义一个接口表示生命周期(根据需求定义生命周期的阶段,这里简单实现):
package script.container.lifecycle; /** * 简单生命周期定义 * @author lixiaohui * */ public interface LifeCycle { void init() throws LifeCycleException; void start() throws LifeCycleException; void restart() throws LifeCycleException; void destroy() throws LifeCycleException; }
其抽象实现如下:
package script.container.lifecycle; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; /** * <pre> * {@link LifeCycle} 的抽象实现 * * 这里用了模板方法模式, 生命周期组件的总体流程由该类实现, 而具体的每个阶段干什么由具体的组件去实现. * </pre> * @author lixiaohui * */ public abstract class AbstractLifeCycle implements LifeCycle { private List<LifeCycleListener> lifeCycleListeners = new ArrayList<>(); /** * 这里需要保证state的可见性, 防止多个线程并发时出问题 */ protected volatile LifeCycleState state = LifeCycleState.NULL; public AbstractLifeCycle(){ addLifeCycleListener(new LifeCycleLogger()); } @Override public void init() throws LifeCycleException { if (state.compare(LifeCycleState.NULL) != 0) {// 不是初始前状态 return; } setState(LifeCycleState.INITIALIZING); try { initInternal(); } catch (LifeCycleException e) { setState(LifeCycleState.FAILED); throw e; } setState(LifeCycleState.INITIALIZED); } private void setState(LifeCycleState state, boolean fireEvent) { this.state = state; if(fireEvent){ fireLifeCycleEvent(new LifeCycleEvent(this, this, state)); } } private void setState(LifeCycleState state) { setState(state, true); } protected abstract void initInternal() throws LifeCycleException; @Override public void start() throws LifeCycleException { if(state.compare(LifeCycleState.INITIALIZED) != 0){ //不是已初始化 init(); } if(state.compare(LifeCycleState.INITIALIZED) != 0){ return; } setState(LifeCycleState.STARTING); try { startInternal(); } catch (LifeCycleException e) { setState(LifeCycleState.FAILED); throw e; } setState(LifeCycleState.STARTED); } protected abstract void startInternal() throws LifeCycleException; @Override public void restart() throws LifeCycleException { if(state != LifeCycleState.STARTED){ throw new LifeCycleException("Illegal lifecycle state: " + state); } setState(LifeCycleState.RESTARTING); try{ restartInternal(); } catch (LifeCycleException e){ setState(LifeCycleState.FAILED); } setState(LifeCycleState.RESTARTED); setState(LifeCycleState.STARTED, false); } protected abstract void restartInternal() throws LifeCycleException; @Override public void destroy() throws LifeCycleException { if(state.compare(LifeCycleState.STARTED) != 0){ //不是已初始化 return; } setState(LifeCycleState.DESTROYING); try { startInternal(); } catch (LifeCycleException e) { setState(LifeCycleState.FAILED); throw e; } setState(LifeCycleState.DESTROYED); } protected abstract void destroyInternal() throws LifeCycleException; protected abstract String name(); protected abstract String type(); private void fireLifeCycleEvent(LifeCycleEvent e) { fireLifeCycleEvent(e, false); } private void fireLifeCycleEvent0(LifeCycleEvent e) { for (LifeCycleListener l : lifeCycleListeners) { l.lifeCycleEvent(e); } } protected void fireLifeCycleEvent(LifeCycleEvent e, boolean asyc) { if (!asyc) { fireLifeCycleEvent0(e); } else { // 异步通知 new Thread(new Runnable(){ @Override public void run() { fireLifeCycleEvent0(e); } }).start(); } } public void addLifeCycleListener(LifeCycleListener l){ lifeCycleListeners.add(l); } public void removeLifeCycleListener(LifeCycleListener l){ lifeCycleListeners.remove(l); } // 日志打印, 可忽略 public class LifeCycleLogger implements LifeCycleListener { private final Logger logger = Logger.getLogger(LifeCycleLogger.class); @Override public void lifeCycleEvent(LifeCycleEvent e) { switch (e.getState()) { case INITIALIZING: logger.info(type() + " " + name() + " initializing..."); break; case INITIALIZED: logger.info(type() + " " + name() + " initialized..."); break; case STARTING: logger.info(type() + " " + name() + " starting..."); break; case STARTED: logger.info(type() + " " + name() + " started..."); break; case RESTARTING: logger.info(type() + " " + name() + " restarting..."); break; case RESTARTED: logger.info(type() + " " + name() + " restarted..."); break; case DESTROYING: logger.info(type() + " " + name() + " destorying..."); break; case DESTROYED: logger.info(type() + " " + name() + " destoryed..."); break; case FAILED: logger.info(type() + " " + name() + " failed..."); break; default: break; } } } }
监听器很简单:
package script.container.lifecycle; import java.util.EventListener; public interface LifeCycleListener extends EventListener { void lifeCycleEvent(LifeCycleEvent e); }
package script.container.lifecycle; import java.util.EventObject; public class LifeCycleEvent extends EventObject { private static final long serialVersionUID = 6757600267753576331L; private AbstractLifeCycle lifeCycle; private LifeCycleState state; public LifeCycleEvent(Object source, AbstractLifeCycle lifeCycle, LifeCycleState state) { super(source); this.lifeCycle = lifeCycle; this.state = state; } public AbstractLifeCycle getLifeCycle() { return lifeCycle; } public void setLifeCycle(AbstractLifeCycle lifeCycle) { this.lifeCycle = lifeCycle; } public LifeCycleState getState() { return state; } public void setState(LifeCycleState state) { this.state = state; } }
package script.container.lifecycle; /** * 生命周期State * @author lixiaohui * */ public enum LifeCycleState{ NULL(0),//初始前 INITIALIZING(1), INITIALIZED(2), STARTING(3), STARTED(4), RESTARTING(5), RESTARTED(6), DESTROYING(7), DESTROYED(8), FAILED(9); private int age; private LifeCycleState(int age){ this.age = age; } public int getAge() { return age; } public int compare(LifeCycleState s){ return age > s.getAge() ? 1 : (age == s.getAge() ? 0 : -1); } }
怎么用呢?组件只需继承AbstractLifeCycle并选择性实现initInternal()、startInternal()、restartInternal()和destroyInternal()即可,想要组件变换生命状态只需调用对应的方法即可;若对组件的生命周期状态感兴趣,则需要添加监听器,届时好得到状态变化的通知。还算比较简单。
相关推荐
### Java对象的生命周期详解 Java对象的生命周期是一个关键概念,涉及到对象从创建到销毁的整个过程。理解这一过程对于高效地编写和管理Java程序至关重要。 #### 创建对象的方式 对象的创建是生命周期的起点,...
内容概要:本文档详细介绍了Android开发的基础概念和架构,涵盖了Android操作系统的特点、核心组件、应用生命周期、进程与线程管理等内容。首先解释了Android作为专为移动设备定制的操作系统,提供了丰富的开发环境...
6. 组件生命周期:在 Java 中,组件可以有不同的生命周期,例如创建、初始化、启动、运行、停止、销毁等。 7. 组件模式:Java 中有多种组件模式,例如 MVC 模式、MVP 模式、MVVM 模式等,每种模式都有其特点和应用...
### JSF生命周期及组件开发详解 #### 一、JSF生命周期概述 JavaServer Faces (JSF) 是一种基于Java EE标准的服务器端组件框架,用于简化企业级Web应用程序的开发。JSF提供了一种声明式的组件化编程模型,使得...
使用Java Servlet实现自动登录退出功能需要了解Java Servlet、自动登录退出功能、Cookie、Filter、UserDao、UserService、Servlet的生命周期、Filter的生命周期、HttpServletRequest和HttpServletResponse等概念。
JSF(JavaServer Faces)是一种用于构建Web应用程序的Java技术,它简化了用户界面...总的来说,JSF生命周期提供了一个结构化的框架,使得开发者能够更专注于业务逻辑和用户界面的实现,而不是底层的HTTP请求处理细节。
2. **生命周期管理**:组件间的生命周期可能会交错,需要合理设计各组件的启动和销毁时机,防止内存泄漏和异常。 3. **数据隔离**:每个组件应有自己的数据存储空间,避免数据冲突。 4. **接口清晰**:组件间通信的...
在Spring框架中,这个生命周期由一系列的回调方法构成,开发者可以通过实现这些回调方法来控制组件的行为。例如,通过实现InitializingBean和DisposableBean接口,可以分别在组件初始化之后和销毁之前执行一些特定的...
### Servlet 生命周期详解 #### 一、概述 ...综上所述,Servlet 的生命周期是理解 Java Web 开发的重要组成部分。通过对各个阶段的理解,开发者可以更好地控制 Servlet 的行为,从而提高应用的性能和可靠性。
JavaBeans通常具有getter和setter方法,以及属性、事件和生命周期方法。在JavaBeans组件编程中,你可能接触到如何创建和使用Bean、属性绑定、事件监听以及使用EJB(Enterprise JavaBeans)进行企业级应用开发等知识...
要实现一个有生命周期感知的网络请求框架,我们首先需要配置Retrofit2,定义一个包含所有网络接口的Service类,如`ApiService`,并使用Retrofit.Builder进行构建。接着,我们可以使用RxJava的Observable来包装...
生命周期的概念在JSF中扮演着至关重要的角色,因为它自动化了许多传统Web技术中需要手动编写的任务。 **JSF请求处理生命周期的高度概述** JSF生命周期主要分为6个阶段:恢复视图、应用请求值、过程验证、更新模型...
它们定义了框架的主要逻辑和功能,包括组件的生命周期管理、事件处理、数据交互等方面。通过这些Java源文件,开发者可以构建出具有独立功能的模块,这些模块能够在Android应用中独立运行或相互协作。 其次,XML配置...
在VisCEB可视化组件库中,XML配置文件可能用于定义组件的属性、状态、生命周期等配置,为组件的运行提供了必要的环境和资源。 在项目源码的文件夹结构方面,src文件夹是存放所有源代码的地方,而.mvn文件夹则可能...
1. `WindowListener`:监听窗口的生命周期事件,如打开、关闭、最小化、恢复等。 2. `WindowFocusListener`:监听窗口获取或失去焦点的事件。 3. `WindowStateListener`:监听窗口状态变化的事件,例如窗口被最大化...
CORBA 对象生命周期之实现和内存管理 Java 教程 CORBA(Common Object Request Broker Architecture)是一种分布式对象架构,允许不同语言编写的对象之间进行通信。CORBA 对象生命周期是指对象从创建到销毁的整个...
- **泛型支持**:Autodispose支持多种生命周期类型,如Android的LifecycleOwner,或自定义的生命周期实现。 **如何使用Autodispose:** 1. **添加依赖**:首先,在项目的build.gradle文件中添加Autodispose的依赖。...
本文将详细介绍如何配置Java开发环境,并探讨常用的Java组件配置,包括报表组件等。 首先,让我们从Java开发环境的基础——JDK(Java Development Kit)安装开始。JDK是Oracle公司提供的用于开发和运行Java应用程序...