`

Java实现组件的生命周期化

    博客分类:
  • Java
阅读更多

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()即可,想要组件变换生命状态只需调用对应的方法即可;若对组件的生命周期状态感兴趣,则需要添加监听器,届时好得到状态变化的通知。还算比较简单。

1
1
分享到:
评论

相关推荐

    Java组件设计.pdf

    6. 组件生命周期:在 Java 中,组件可以有不同的生命周期,例如创建、初始化、启动、运行、停止、销毁等。 7. 组件模式:Java 中有多种组件模式,例如 MVC 模式、MVP 模式、MVVM 模式等,每种模式都有其特点和应用...

    使用Java servlet实现自动登录退出功能

    使用Java Servlet实现自动登录退出功能需要了解Java Servlet、自动登录退出功能、Cookie、Filter、UserDao、UserService、Servlet的生命周期、Filter的生命周期、HttpServletRequest和HttpServletResponse等概念。

    JSF生命周期及组件开发

    ### JSF生命周期及组件开发详解 #### 一、JSF生命周期概述 JavaServer Faces (JSF) 是一种基于Java EE标准的服务器端组件框架,用于简化企业级Web应用程序的开发。JSF提供了一种声明式的组件化编程模型,使得...

    安卓组件化开发架构,设计思路,代码大全

    2. **生命周期管理**:组件间的生命周期可能会交错,需要合理设计各组件的启动和销毁时机,防止内存泄漏和异常。 3. **数据隔离**:每个组件应有自己的数据存储空间,避免数据冲突。 4. **接口清晰**:组件间通信的...

    JSF生命周期及组件开发P

    JSF(JavaServer Faces)是一种用于构建Web应用程序的Java技术,它简化了用户界面...总的来说,JSF生命周期提供了一个结构化的框架,使得开发者能够更专注于业务逻辑和用户界面的实现,而不是底层的HTTP请求处理细节。

    Servclet 生命周期

    ### Servlet 生命周期详解 #### 一、概述 ...综上所述,Servlet 的生命周期是理解 Java Web 开发的重要组成部分。通过对各个阶段的理解,开发者可以更好地控制 Servlet 的行为,从而提高应用的性能和可靠性。

    java服务器组件编程

    JavaBeans通常具有getter和setter方法,以及属性、事件和生命周期方法。在JavaBeans组件编程中,你可能接触到如何创建和使用Bean、属性绑定、事件监听以及使用EJB(Enterprise JavaBeans)进行企业级应用开发等知识...

    Android-rxjava2retrofit2rxlifecycle2有生命周期感知的网络请求框架封装

    要实现一个有生命周期感知的网络请求框架,我们首先需要配置Retrofit2,定义一个包含所有网络接口的Service类,如`ApiService`,并使用Retrofit.Builder进行构建。接着,我们可以使用RxJava的Observable来包装...

    JSF 生命周期 实例详解

    生命周期的概念在JSF中扮演着至关重要的角色,因为它自动化了许多传统Web技术中需要手动编写的任务。 **JSF请求处理生命周期的高度概述** JSF生命周期主要分为6个阶段:恢复视图、应用请求值、过程验证、更新模型...

    Java_窗体组件用法大全

    1. `WindowListener`:监听窗口的生命周期事件,如打开、关闭、最小化、恢复等。 2. `WindowFocusListener`:监听窗口获取或失去焦点的事件。 3. `WindowStateListener`:监听窗口状态变化的事件,例如窗口被最大化...

    2022年CORBA对象生命周期之实现和内存管理Java教程.docx

    CORBA 对象生命周期之实现和内存管理 Java 教程 CORBA(Common Object Request Broker Architecture)是一种分布式对象架构,允许不同语言编写的对象之间进行通信。CORBA 对象生命周期是指对象从创建到销毁的整个...

    rxjava+自动+生命周期+autodispose

    - **泛型支持**:Autodispose支持多种生命周期类型,如Android的LifecycleOwner,或自定义的生命周期实现。 **如何使用Autodispose:** 1. **添加依赖**:首先,在项目的build.gradle文件中添加Autodispose的依赖。...

    java开发环境及组件配置文档

    本文将详细介绍如何配置Java开发环境,并探讨常用的Java组件配置,包括报表组件等。 首先,让我们从Java开发环境的基础——JDK(Java Development Kit)安装开始。JDK是Oracle公司提供的用于开发和运行Java应用程序...

    面向对象方法EJB组件.pdf

    这些描述展示了EJB容器在EJB组件生命周期中扮演的关键角色。 总结以上内容,这篇文档应该是关于EJB组件开发的指导手册或教程,详细阐述了创建EJB组件的步骤、EJB组件的分类、中间件和容器的作用以及EJB容器在部署和...

    Activity生命周期及Intent传值

    理解Activity的生命周期和Intent的传值机制对于Android开发者来说至关重要。 Activity的生命周期分为三个主要阶段:启动(Start)、运行(Running)和销毁(Destroy)。在启动过程中,Activity会经历onCreate()、...

Global site tag (gtag.js) - Google Analytics