2012-01-20 109 views
0

使用通用的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或不是。

+3

如果你不喜歡單身的事情,那麼春天會讓你很不高興。 – skaffman

+0

Spring bean與單例模式不同,但這是另一個論點全部在一起=) – ltfishie

+0

不,他們沒有。根據定義,單例在一個範圍內是唯一的。區別僅在於範圍。 Classic singleton = ClassLoader,Spring Bean = Application。這個概念保持不變。 –

回答

0

使用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 
    } 
} 

你也可以添加保存方法,並相應地重命名。所有定製的daos應該可以作爲bean使用。

1

首先,DaoRegistry是單身人士的問題是什麼?

無論如何,你可以有你的實體的抽象基類,它會實現節省這樣

public T save(){ 
    DaoRegistry.getInstance().getDao(this.getClass()).save(this); 
} 

那麼你可以簡單地調用someEntity.save()

也可能是更直接,如果實體類本身實現了整個GenericDao接口(保存,刪除和查找方法),因此您的GenericDaoImpl的內容將位於實體的基類中。

+0

嗯,這是一個想法。這將使它接近ActiveRecord。任何人都在意如果這樣做有什麼不利之處呢? – ltfishie

+0

專業:非常方便。 Con:這很糟糕。實體不應該知道在哪裏,如何以及如何將它們存儲在任何地方。 –

+0

「實體不應該知道在哪裏,如何以及如何將它們存儲在任何地方。」 我同意。 – bpgergo