[英]Spring 3 Service Dao layers with abstract class question
我正在尝试在服务层中实现通用抽象类。 我已经在我的dao层中使用了类似的模式,并且工作正常。 我在Spring in Practice v8电子书中找到了一个工作示例。 我想知道是否有一种方法可以自动连接以下工作代码。 (代码有效,但是在类中使用任何其他方法之前,我必须调用辅助方法“ setDao”)
测试类别:
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();
}
不必调用方法( setDao()
)来允许您的子类将DAO引用传递给您的超类,为什么要反转方向并强制子类将DAO提供给超类?
例如:
public abstract class AbstractServiceImpl<T extends Object> implements AbstractService<T> {
private AbstractDao<T> dao;
abstract AbstractDao<T> getDao();
public void save(T t) {
getDao().save(t);
}
}
public class FooServiceImpl extends AbstractServiceImpl<Foo> {
@Autowired
private FooDao fooDao;
@Overrides
public AbstractDao<Foo> getDao() {
return fooDao;
}
}
无需从外部调用方法即可将引用传递链付诸实践。
尝试使MyServiceImpl实现InitializingBean,并将setDao()方法更改为afterPropertiesSet()。 在框架调用设置器后,它将自动被调用。
或者,(甚至更简单),只需在setHeaderDao(...)方法中调用setDao()。
将spring框架版本升级到4,即可解决问题。
检查此页面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.