吾道的是在安裝,如:如何讓我的服務層中暴露的Dao方法?
UserDao
UserDaoImpl
我的業務層是服務類,如:
UserService
UserServiceImpl
現在我道的有像獲取,更新,保存等
基本操作我想在我的服務類中公開這些方法,而無需手動將這些方法添加到每個服務接口。
我該如何做到這一點?
吾道的是在安裝,如:如何讓我的服務層中暴露的Dao方法?
UserDao
UserDaoImpl
我的業務層是服務類,如:
UserService
UserServiceImpl
現在我道的有像獲取,更新,保存等
基本操作我想在我的服務類中公開這些方法,而無需手動將這些方法添加到每個服務接口。
我該如何做到這一點?
如果該服務除了CRUD操作沒有其他任何操作,並且沒有其他服務需要該DAO,我不會看到爲什麼您不能將這些操作放在服務實現中,並免除DAO。
這是很容易只使用該服務作爲一個傳遞:
public interface FooService {
Foo find(Long id); // Same as DAO signature
}
@Service
public class FooServiceImpl implements FooService {
@Resource(name = "fooRepository")
private FooRepository fooRepository;
public Foo find(Long id) { return this.fooRepository.find(id); }
}
有可能寫一個通用的DAO:
public interface GenericRepository<V, K extends Serializable> {
V find(K key);
List<V> find();
K save(V value);
void update(V value);
void delete(V value);
}
是的,這是一種適配器模式
的變化您還可以將UserDaoImpl擴展爲UserServiceImpl,例如
UserServiceImpl extend UserDaoImpl implements UserService{
// Rest of the Service implementation
}
服務的要點是在事務中聚合DAO方法,並添加業務邏輯。如果你所有的服務都在包裝單獨的DAO方法,那麼沒有必要擁有它們。使用像Grails這樣的框架(或者Play,所以你仍然可以使用Java)數據訪問方法被動態地添加到你的域對象中,你可以從控制器中調用它們,並且有更少的CRUD代碼來混亂如果您以後需要這些服務,請選擇服務作爲選項)。
同意的意見,但我會有業務邏輯可能不是基本的獲取/更新/刪除方法,並且必要時我會覆蓋。 – codecompleting 2011-12-29 19:02:02
是的,但是當我有10個服務類時,它是編寫代碼的一部分,只是希望有一種方法可以免費使用某些OOP /泛型。 – codecompleting 2011-12-29 16:30:12
@codecompleting:具有與通用存儲庫類似的通用基類,並委派到通用DAO。 – 2011-12-29 17:00:55
我有一個通用的存儲庫,但問題是我使用hibernate時必須通過類類型作爲參數。例如:http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao-hibernate/src/main/java/com/googlecode/genericdao/dao/hibernate/GeneralDAOImpl .java我希望我不必這樣做,也許我可以在每個Dao中設置一個私有屬性來設置類的類型,而不必將它作爲參數,您怎麼看? –
codecompleting
2011-12-29 22:40:53