3

我对代码的设计进退两难。

首先,我正在将 VB 转换为 Java 系统。VB程序有一个类模块,它类似于POJO的组合,并为其逻辑访问数据库。我用 getter 和 setter 在 JAVA 中创建了一个类似的类。我的困境是,由于我需要复制 VB 代码的结构(我们被迫这样做),我还需要在我的 JAVA 类中包含查询服务。但是在我们的框架中,只有服务类可以访问查询服务。

我正在考虑将我的 JAVA 类更改为抽象类,并改用 Anonymous 类。

样本:

public abstract class MyClass {
     private int a;
     private int b;

     public String calculate1() {
          // do processing for variables a and b
          String sql = "" // build sql here
          List<Map<String, Object>> result = query(sql);
     }

     public String calculate2() {
          // do processing for variables a and b
          String anotherSql = "" // build anotherSql
          List<Map<String, Object>> result = query(anotherSql);
     }

     protected abstract List<Map<String, Object>> query(String sql);

     // getters and setters for a and b
}

public class MyService {
     @Autowired
     private QueryService myQueryService;

     public void execute() {
          MyClass myClass = new MyClass() {
             @Override
             protected List<Map<String, Object>> query(String sql) {
                 return myQueryService.executeQuery(sql);
             }
          };
     }
}

有几点需要考虑:

  1. 我的服务是一个单例范围的 bean。
  2. 我也喜欢 MyClass 是基于会话的(每个用户 1 个实例)。
  3. 由于我不会在我的 Spring 上下文中声明 MyClass,它不能使用依赖注入,也不能使用其他服务。我将在会话中保存该实例,并将仅检索 MyClass 的实例。

也因为这个困境,我不得不使用字符串查询和 JDBC 模板。最初,我们的框架使用 DAO 对象和 Hibernate。如果有人也可以使用DAO解决代码,那就更好了。如果我将使用 DAO 对象,我将不得不将不同的 DAO 对象与它们的 DAO 服务类一起使用。

我不完全确定这是否是一个好的设计。我也不知道这是否可行。我无法在我的环境中运行它。

如果有人能启发我,我将不胜感激。

谢谢!

4

1 回答 1

1

既然MyClass没有 的实例就无法运行QueryService,那么您只需将查询服务的引用传递给 的构造函数即可MyClass

public abstract class MyClass {
    private final QueryService queryService;

    public MyClass (QueryService queryService) {
        this.queryService = queryService;
    }

    protected List<Map<String, Object>> query(String sql) {
        return queryService.executeQuery(sql);
    }
}

public class MyService {
     @Autowired
     private QueryService myQueryService;

     public void execute() {
          MyClass myClass = new MyClass(myQueryService);
     }
}

制作queryService实例字段final,并拥有这样的构造函数,在代码中清楚地表达了这种依赖关系。

于 2012-10-27T18:13:14.990 回答