私はベストプラクティスを再利用するコードに従おうとしています。 は、私はいくつかの一般的な方法で、一般的な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クラスにその作業を完全に委任します。したがって、具体的な各Service実装では、適切な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と同じようにサービスクラスをgenerifyしますか?私の具体的なクラスがなりますように:
@Autowired
private GenericDao<T> dao;
をので、私はdao
のメソッドを呼び出すことができること:
public class CustomerServiceImpl extends GenericService<Customer> implements CustomerService {
.....
}
問題は、私は汎用サービスでDAOクラスをautowireすることができないということです。 私はコンストラクタでそれを行う必要がありますか?
もう1つの質問 - @Transactional
のメソッドに注釈を付ける適切な場所はどこですか - ジェネリッククラスまたはすべての実装クラスでですか?
可能な回答が多すぎるか、この回答の回答が長すぎる可能性があります。回答セットを絞り込むか、いくつかの段落で回答できる問題を特定するための詳細を追加してください。 –
主な質問は 'GenericService'クラスの ''型の 'GenericDao'をどのようにautowireするのですか? –
DimaSan