pojo类继承pojo类
在Java中,您可以轻松地在Plain Old Java Object(POJO)类中实现一些业务逻辑,并且可以在高级服务器或框架中轻松运行它们。 有许多服务器/框架,例如JBossAS,Spring或Camel等,它们使您可以部署POJO甚至不对其API进行硬编码。 显然,如果愿意耦合到它们的API细节,您将获得高级功能,但是即使您这样做,也可以通过将自己的POJO和他们的API封装在包装器中来使这些特性降至最低。 通过编写和设计尽可能简单的POJO自己的应用程序,您将拥有最灵活的方式来选择框架或服务器来部署和运行您的应用程序。 在这些环境中编写业务逻辑的一种有效方法是使用
服务组件。 在本文中,我将分享在编写
Services方面学到的一些知识。
什么是服务?
如今,“ 服务 ”一词已被过度使用,对不同的人可能意味着很多事情。 当我说Service时 ,我的定义是一个具有最小生命周期(例如init
, start
, stop
和destroy
)的软件组件。 在编写的每个服务中,您可能不需要生命周期的所有这些阶段,但是您可以简单地忽略那些不适用的服务。 在编写旨在长期运行的大型应用程序(例如服务器组件)时,定义这些生命周期并确保按正确的顺序执行它们是至关重要的!
我将带领您完成我准备的Java演示项目。 这是非常基础的,应该独立运行。 它具有的唯一依赖性是SLF4J记录器。 如果您不知道如何使用记录器,则只需将它们替换为System.out.println
。 但是,我强烈建议您学习在应用程序开发期间如何有效使用记录器。 另外,如果您想尝试与Spring相关的演示,那么显然您也将需要其jar。
编写基本的POJO服务
您可以在界面中如下所示快速定义具有生命周期的服务合同。
package servicedemo;
public interface Service {
void init();
void start();
void stop();
void destroy();
boolean isInited();
boolean isStarted();
}
开发人员可以自由地在Service实现中做他们想做的事情,但是您可能想给他们一个适配器类,这样他们就不必在每个Service上重写相同的基本逻辑。 我将提供这样的抽象服务:
package servicedemo;
import java.util.concurrent.atomic.*;
import org.slf4j.*;
public abstract class AbstractService implements Service {
protected Logger logger = LoggerFactory.getLogger(getClass());
protected AtomicBoolean started = new AtomicBoolean(false);
protected AtomicBoolean inited = new AtomicBoolean(false);
public void init() {
if (!inited.get()) {
initService();
inited.set(true);
logger.debug('{} initialized.', this);
}
}
public void start() {
// Init service if it has not done so.
if (!inited.get()) {
init();
}
// Start service now.
if (!started.get()) {
startService();
started.set(true);
logger.debug('{} started.', this);
}
}
public void stop() {
if (started.get()) {
stopService();
started.set(false);
logger.debug('{} stopped.', this);
}
}
public void destroy() {
// Stop service if it is still running.
if (started.get()) {
stop();
}
// Destroy service now.
if (inited.get()) {
destroyService();
inited.set(false);
logger.debug('{} destroyed.', this);
}
}
public boolean isStarted() {
return started.get();
}
public boolean isInited() {
return inited.get();
}
@Override
public String toString() {
return getClass().getSimpleName() + '[id=' + System.identityHashCode(this) &