通常使用以下方式命名DAO吗:
UserDAO - interface
UserDAOImpl - implements UserDAO
我想知道在实现时是否标准使用后缀“Impl”,或者是否有更好的做法。谢谢。
我见过两种惯例:
前者的根源在于CORBA;后者是Microsoft COM/.NET的惯例。(感谢Pascal提供的更正。)
“不要重复DAO”是一个好主意。我个人认为那篇文章比它需要的复杂。有一种方法可以在查找器中不使用反射来完成,我碰巧更喜欢这种方法。如果您使用Hibernate,则可以通过示例查询来简单地完成它。接口看起来更像这样:
package persistence;
import java.io.Serializable;
import java.util.List;
public interface GenericDao<T, K extends Serializable>
{
T find(K id);
List<T> find();
List<T> find(T example);
List<T> find(String queryName, String [] paramNames, Object [] bindValues);
K save(T instance);
void update(T instance);
void delete(T instance);
}
一般我使用这种方式。有时,如果您正在创建一个期望他人实现但提供参考实现的接口,则像DefaultUserDAO
这样的默认前缀可能更有意义。
大多数情况下,我认为这两个可以互换使用,但在某些情况下,一个比另一个提供更多的清晰度。
DAO
(接口)SessionDAO
和EntityManagerDAO
- 用于使用Session
或EntityManager
Dao
,尽管这是一个缩写; 和Impl
后缀)public interface PersistListener<T> {
void onPersist(T item);
}
类似的结构也可以用于删除操作。如果您需要一种事件日志记录每个活动,但又不想使用AOP,则这尤其有用。
我的GenericDaoImpl大致如下:
public class GenericDaoImpl<T> extends HibernateTemplate {
public void setPersistListeners(List<PersistListener> listeners) {
this.persistListeners = new GenericInterfaceHandler( listeners,
PersistListener.class );
}
// hibernate updates the key to the object itself
public T save(T item) {
getSession().save( item );
List<PersistListener<T>> listeners = this.persistListeners.getAll( item );
for ( PersistListener<T> listener : listeners )
listener.persist( item );
}
// ...
}