使用通用的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/