コードが繰り返されているサービスがたくさんあります。すべてのサービスで拡張できるように、汎用サービスを実装する方法を知りたいです。
サービスインターフェイスの例(繰り返しコード):
@Service
public interface IUserService{
List<User> findAll();
User save(User entity);
User findById(long id);
void delete(User entity);
void deleteById(long id);
long count();
}
@Service
public interface IEventService{
List<Event> findAll();
Event save(Event entity);
Event findById(long id);
void delete(Event entity);
void deleteById(long id);
long count();
}
そして、それらの実装(今、私はすべての実装で同じコードを使用しています):
@Service
public class EventService implements IEventService{
@Autowired
private IEventDao dao;
@Override
public List<Event> findAll() {
return dao.findAll();
}
@Override
public Event save(Event entity) {
return dao.save(entity);
}
Other CRUD methods...
}
@Service
public class UserService implements IUserService{
@Autowired
private IUserDao dao;
@Override
public List<User> findAll() {
return dao.findAll();
}
@Override
public User save(User entity) {
return dao.save(entity);
}
Other CRUD methods...
}
これは Java generics を使用するとかなり簡単です。実際のクラスUser
、Event
などを型パラメーターで置き換えることができます。
public interface IGenericService<T> {
List<T> findAll();
T save(T entity);
T findById(long id);
void delete(T entity);
void deleteById(long id);
long count();
}
次に、実装についても同じようにします。
public class GenericService<T> implements IGenericService<T> {
// The DAO class will also need to be generic,
// so that it can use the right class types
@Autowired
private IDao<T> dao;
@Override
public List<T> findAll() {
return dao.findAll();
}
@Override
public T save(T entity) {
return dao.save(entity);
}
// Other CRUD methods...
}
さらに、実際のサービスを次のように作成することもできます。
@Service
class UserService extends GenericService<User> { }
@Service
class EventService extends GenericService<Event> { }
Javaドキュメントからの良いチュートリアルです: Java言語:Generics)を学ぶ
別の良い例: Java Generics の基本