我想在我的服務層實現一個通用的抽象類。我已經在我的dao圖層中使用了一個simliar模式,它工作正常。我在Spring in Practice v8電子書中找到了一個實例。我想知道是否有辦法自動調用以下工作代碼。 (代碼工作,但我打電話給我的助手方法「setDao」之前,我在課堂上使用的任何其他方法)春季3服務道層與抽象類問題
測試類:
public class App {
public static void main(String[] args) {
ApplicationContext appContext = new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");
MyService service = (MyService)appContext.getBean("myService");
service.setDao();
Heading detail = new Heading();
detail.setName("hello");
service.save(detail);
Heading dos = service.findById(Long.valueOf(1));
System.out.println(dos);
}
}
MyServiceImpl類
@Service("myService")
public class MyServiceImpl extends AbstractServiceImpl<Heading> implements HeadingService {
@Autowired
private HeadingDao headingDao;
public void setHeadingDao(HeadingDao headingDao) {
this.headingDao = headingDao;
}
public void setDao() {
super.setDao(this.headingDao);
}
}
爲MyService接口
public interface HeadingService extends AbstractService<Heading> {
public void setDao();
}
AbstractServiceImpl類
@Service
public abstract class AbstractServiceImpl<T extends Object> implements AbstractService<T> {
private AbstractDao<T> dao;
public void setDao(AbstractDao<T> dao) {
this.dao = dao;
}
public void save(T t) {
dao.save(t);
}
public T findById(Long id) {
return (T)dao.findById(id);
}
public List<T> findAll() {
return dao.findAll();
}
public void update(T t) {
dao.update(t);
}
public void delete(T t) {
dao.delete(t);
}
public long count() {
return dao.count();
}
}
AbstractService接口
public interface AbstractService<T extends Object> {
public void save(T t);
public T findById(Long id);
public List<T> findAll();
public void update(T t);
public void delete(T t);
public long count();
}
順便說一句,關於你的AbstractService - 看起來好像你的通用DAO和服務接口有幾乎相同的方法定義。這有什麼意義 - 如果大量的服務方法只是調用DAO方法,爲什麼還要爲DAO提供一個單獨的服務層呢?每個使用AbstractService的類是否真的需要能夠訪問'count()'或'findAll()'方法?我建議考慮減少這個抽象類中可用的服務層方法的大小,並且只編寫真正需要的方法 - 應該減少很多代碼。 –
謝謝。這確實更有意義。 – blong824