【发布时间】:2018-12-18 22:27:44
【问题描述】:
我正在尝试为我的应用程序创建业务逻辑(服务)和存储库(数据访问)层。我想正确地做到这一点,但我不是专家。
目前,对于 Repository 层,我创建了一个扩展 JpaRepository 的接口 IMainDao:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface IMainDao extends JpaRepository<Object, Integer>{
}
所以我所有的存储库接口都可以扩展 IMainDao:
import org.springframework.stereotype.Repository;
@Repository
public interface IUserDao extends IMainDao{
}
我还创建了业务逻辑层。一个接口IMainService:
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public interface IMainService {
Object getById(int id);
List<Object> getAll();
Object create(Object o);
Object update(Object o);
void delete(int id);
}
这个接口MainService
的实现@Service
public class MainService implements IMainService{
@Autowired
private IMainDao mainDao;
@Override
public Object getById(int id) {
return mainDao.findById(id);
}
@Override
public List<Object> getAll() {
return mainDao.findAll();
}
@Override
public Object create(Object o) {
Object obj = mainDao.save(o);
return obj;
}
//Other methods...
以及扩展 IMainService 的其他接口,如 IUserService:
import org.springframework.stereotype.Service;
@Service
public interface IUserService extends IMainService{
}
他们的实现:
public abstract class UserService implements IUserService{
}
我做得对吗?如果没有,你有什么推荐给我的,我可以在哪里优化?
谢谢!
【问题讨论】:
-
我想创建我的其他接口,而不必在其实现中重新创建方法。
-
好吧,第一个春天不是这样工作的。 JpaRepository 需要知道它正在处理什么实体类型,放入 Object 是行不通的。如果您注入的所有内容都具有相同的类型,则无法按类型自动连接。
-
谢谢,我明白了。我删除了 IMainDao,所以我所有的存储库都扩展了 JpaRepository。但是,关于服务,我想避免在他们的实现中重新创建像
public Object getById(int id) { return mainDao.findById(id); }这样的方法 -
@Johna 说 IMainDao 是不必要的。您可以直接从 JpaRepository 扩展您的存储库。服务类是您放置业务逻辑的地方。您实际上在做的是在服务类中编写业务逻辑并提供适配器来访问存储库的那些,因此您的适配器是存储库接口。
标签: java spring spring-boot data-access-layer business-logic