【发布时间】:2016-10-12 11:13:24
【问题描述】:
我正在尝试遵循代码重用最佳实践。 我有一些通用方法的通用 DAO 接口:
public interface DaoInterface<T> {
T findById(int id);
//...more methods...
}
及其实现类:
public class GenericDao<T> implements DaoInterface<T> {
@SuppressWarnings("unchecked")
private final Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
@Autowired
protected SessionFactory sessionFactory;
@Override
@SuppressWarnings("unchecked")
public T findById(int id) {
Session session = sessionFactory.getCurrentSession();
return (T) session.get(persistentClass, id);
}
//...more methods...
}
然后我的每个具体实现类都扩展GenericDao 并实现它的接口。
我的应用程序中也有服务层。一些服务的方法完全将它们的工作委托给 DAO 类。因此,在每个具体的服务实现中,我都会自动装配适当的 DAO 类并调用它的方法。 所以现在看起来:
public interface CustomerService {
Customer findById(int id);
}
和实施:
@Service
@Transactional(readOnly = true, rollbackFor = Exception.class)
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerDao customerDao;
@Override
public Customer findById(int id) {
return customerDao.findById(id);
}
}
我的问题是 - 如何以与 DAO 相同的方式生成服务类?这样我的具体类就会看起来:
public class CustomerServiceImpl extends GenericService<Customer> implements CustomerService {
.....
}
问题是我无法在通用服务中自动装配 DAO 类:
@Autowired
private GenericDao<T> dao;
这样我就可以调用dao 的方法。
我应该在构造函数中这样做吗?
还有一个问题 - 在泛型类或每个实现类中使用 @Transactional 注释方法的正确位置在哪里?
【问题讨论】:
-
可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案范围或隔离可以在几段中回答的问题。
-
主要问题是如何在
GenericService<T>类中自动装配<T>类型的GenericDao?
标签: java spring generics service dao