0

我试图在一些 JavaEE bean 中按照模板方法模式的方式实现一些东西,这些 bean 对数据集进行一些处理工作。

每个处理 bean 接受 Job 对象,做一些工作然后为下一个 bean 返回更新后的作业(总共大约 10 个),每个 bean 有一个同名的方法(doProcessing)和一个参数(job)

我想在每个 bean 'doProcessing' 方法的开始和结束时执行一些日志记录,以便在处理结束时作业包含来自每个 bean 的日志记录信息(存储在 hashmap 等中)

我当前的实现看起来像这样......

@Stateless
public class processingTaskOne(){

    public void doProcessing(Job job){

        //always called at beginning of method
        String beanReport = "Info from Task 1: ";

        for(int i=0; i<job.getDataArray().size();i++){
            beanReport+="\n some more info";
            //Do some processing work here
        }

        //always called at end of method
        job.addNewReportSection(beanReport)

    }

}

但我知道我可以做得比这更好,使用继承我应该能够创建一个超类......

public abstract class Reportable{

    private String sectionReport;

    public void preProcessing(Job job){
        //Setup bean report, use reflection to get subclass name 
    }

    public void postProcessing(Job job){
        //Finish bean report and append to job
        job.addNewReportSection(sectionReport)
    }

    public abstract doProcessing(){
        //not sure how this should work
    }

}

任何扩展超类的类都将自动执行预处理/后处理操作......

@Stateless
public class processingTaskOne() extends Reportable{

    public void doProcessing(Job job){

        for(int i=0; i<job.getDataArray().size();i++){

            super.sectionReport += "log some info"
            //Do some processing work here

        }

    }

}

但是我一直无法弄清楚如何准确地实现这一点,因为所有示例都引用了 POJO,并且由于我的 bean 是 @Stateless,因此没有构造函数。

有人可以提供一些指导吗?我在吠叫错误的树吗?

4

1 回答 1

2

如果我正确理解了您的问题,您可以尝试以下操作:

public abstract class Reporting {
  public void setUp(Job job) {
    // set things up
  }

  public void tearDown(Job job) {
    // post-processing stuff
  }

  public void process(Job job) {
    setUp(job);
    doProcessing(job);
    tearDown(job);
  }

  public abstract void doProcessing(Job job);
}

public class Processor1 extends Reporting {
  @Override
  public void doProcessing(Job job) {
    // business logic
  }
}

稍后,在您的代码中的某个地方,您不应该调用doProcessing(),而是调用process()基类的方法。

此外,如果我的解释是正确的,您可能会对使用一些面向方面的编程框架感兴趣,例如 AcpectJ 或 Spring AOP。

于 2014-11-19T22:39:50.060 回答