使用通用的dao模式,我定义了通用的接口:

public interface GenericDao<T extends DataObject, ID extends Serializable> {
    T save(T t);
    void delete(ID id);
    T findById(ID id);
    Class<T> getPersistentClass();
}


然后,我实现了默认的GenericDaoImpl实现,以使用以下构造函数执行这些功能:

public GenericDaoImpl(Class<T> clazz) {
    this.persistentClass = clazz;
    DaoRegistry.getInstance().register(clazz, this);
}


DaoRegistry的目的是通过与之关联的类来查找Dao。这使我可以扩展GenericDaoImpl并为需要特殊处理的对象覆盖方法:

DaoRegistry.getInstance().getDao(someClass.getClass()).save(someClass);


虽然可以使用,但我有些不满意的地方:


DaoRegistry是一个单身人士
调用保存的逻辑很复杂


有一个更好的方法吗?

编辑
我不想讨论Singleton是否为anti-pattern

最佳答案

最好使用DaoRegistry实例而不是静态方法。它将使测试配置更易于管理。您可以将其实现为

@Component("daoRegistry")
public class DaoRegistry {
  @Autowired
  private List<GenericDao> customDaos;

  private GenericDao defaultDao = new GenericDaoImpl();

  public <T> T getDao(Class<T> clazz) {
    // search customDaos for matching clazz, return default dao otherwise
  }
}


您也可以向其添加保存方法并相应地重命名。所有定制的dao应该以bean形式提供。

关于java - 道注册表重构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8944476/

10-09 19:59