请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

是否有必要在Serice层建立IService和Impl的

老师您好,看到您在mongo的Service层先创建了interface然后创建了impl实现了各个interface,请问这是mongo提供的规范吗?
日常在写跟Mysql的交互的时候,在Service层好像也没有先创建接口,再创建实现,都是直接创建各个Service的,而且Mongo在Service层不创建interface直接创建各个Service也可以运行,也没看到任何的提醒建议之类的。
求指点~~

正在回答 回答被采纳积分+3

1回答

松思园 2024-07-02 13:45:34
你好同学,这个是软件设计模式的理论了,跟mongo没有关系的,使用接口和实现类的方式定义服务层是一种普遍的编程实践,这种方式提供了代码的解耦合、提高了代码的可扩展性和可维护性,尤其是大型项目中这种方式的是必须的。建议学完数据库操作后,感兴趣的话可以了解一下spring项目分层架构,以及开发设计模式,尤其是设计模式学习后再去读一些框架源码,就会体会到这样规范的原因和必要性啦
0 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕粉4436965 #1
    感谢老师!那还有个小问题,这种情况下,controller里的@Autowired是不是改成下面这样更能符合此初衷呢,考虑到复杂项目一个IArticlesService 可能有很多不同的实现
    @Autowired
    private IArticlesService articlesService;
    改成下面的
    private final IArticlesService articlesService;
    
    public ArticlesController(ArticlesServiceImpl articlesService) {
    	this.articlesService = articlesService;
    }
    回复 有任何疑惑可以回复我~ 2024-07-02 14:25:44
  • 松思园 回复 提问者 weixin_慕粉4436965 #2
    如果一个接口对应一个实现类,使用@Autowired可以直接注入对应的bean对象,如果是多个实现类的话,需要指定注入的实现类,这需要使用@Qualifier 注解来制定注入的对象,只不过在默认情况下一个实现类的话,@Autowired会注入对应类的小写字母开头的bean,比如我们@Autowired
    private IArticlesService articlesService; 
    等价于
    @Autowired
    @Qualifier(“iArticlesService ”)
    private IArticlesService articlesService;
    
    那如果是多个实现类,就可以指定具体的注入bean对象,这个前提是要在 对应的service实现类中通过@Service注解指定对应的名称。这一块可以具体再深入了解一下spring容器自动装配的工作原理。
    至于你说的改成构造方法实现的方式,也是可以实例化对应的service对象,但不便于解决对象之间的依赖关系,以及影响代码的开发效率
    回复 有任何疑惑可以回复我~ 2024-07-03 09:12:48
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信