以下列方式命名 DAO 是否很典型:
UserDAO - interface
UserDAOImpl - implements UserDAO
我想知道它的标准是否使用后缀“Impl”来实现,或者更有意义的东西是否是最佳实践。谢谢。
这通常是我使用的。有时,如果您正在创建一个您希望其他人实现但您提供参考实现的接口,则Default前缀 like可能更有意义。DefaultUserDAO
大多数时候我觉得这两个可以互换使用,但在某些情况下,一个比另一个更清晰。
我见过两种约定:
前者源于 CORBA;后者是 Microsoft COM/.NET 约定。(感谢帕斯卡的更正。)
“不要重复 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);
}
首先 - 您可能并不真的需要为您的每个类创建一个 DAO 类。不要重复 DAO!文章解释了什么是通用 DAO。想知道如何命名样板代码是没有效率的。
现在,当你有一个通用的 DAO 时,你可以选择:
DAO
(界面)SessionDAO
和EntityManagerDAO
- 用于使用Session
或EntityManager
当然,只能通过接口使用 DAO。您可以轻松地在实现之间切换。
(我实际上更喜欢它小写 - Dao
,虽然它是一个缩写;和Impl
后缀)
我也是 GenericDao 和 GenericDaoImpl -convention 的粉丝,在通用帮助类的一些支持下,如果保存或删除需要一些持久类的额外操作:
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 );
}
// ...
}
上面示例中的persistListener 所做的是找到一个与作为参数给出的类匹配的泛型类的PersistListener。找到它,然后将调用委托给适当的侦听器。我的 GenericInterfaceHandler 也可用于仅返回最特定的处理程序或仅返回给定类的处理程序(如果存在)。
如果您有兴趣,我还可以发布 GenericInterfaceHandler 实现,因为它在很多情况下都是非常强大的构造。