SpringBoot中的业务层(Service)是否要创建接⼝,以及如果Service有多。。
参考⽂档:
⼀、Spring Boot中的业务层(Service)是否要创建接⼝?
借助Spring Boot框架开发web项⽬时,在业务层(Service)这⼀部分,标准做法是:定义⼀个接⼝,然后再⼀个或多个类去实现。那么疑问来了:
为什么我们要维护两份同构代码,⽽不直接使⽤⼀个类呢?
不创建接⼝,通过把业务实现类直接通过注解@Autowired注⼊控制层Controller,也⼀点不耽误功能的实现啊,那么我为什么还要创建接⼝?
⽹上⼤部分回答都是说什么⾯向对象的解耦云云,引经据典,说得都很好,然⽽,都没有从根本上回答我们关⼼的问题:为什么要⽤接⼝?
业务层(Service)中为什么⼀定要⽤接⼝,不⽤⾏不⾏?回答:不是必须要使⽤接⼝,但强烈建议使⽤接⼝。
情景1: 在开源框架中有很多这种情况,就是某个功能⽀持⽤户⾃定义扩展.说⽩了,它提供了⼀个接⼝,我们只需要实现这个接⼝,把我们⾃⼰的实现逻辑补上,就可以让框架按照我们的逻辑来执⾏.问题来了,框架的作者并不知道我们的实现类是什么,如果不定义⼀个接⼝,那么要如何在框架中调⽤我们的实现类呢?
情景2: 我和同事分别做项⽬的2个不同功能模块,但是同事的功能中却需要调⽤我这头实现的部分逻辑.为了让他有⼀个"占位符"可⽤,我是不是应该快速的写个接⼝扔给他呢?
情景3: ⼀个适配器功能,或是说⼀个简单的⼯⼚类,如果没有定义接⼝,那么⾯对众多实现类,要如何统⼀操作呢?
情景4: 想让项⽬的代码符合某种"规范",但是⼜不可能看着别⼈写代码吧,那好办,先出⼀套接⼝,然后你们就看着办~
情景5: java中没有多继承,但是可以多实现接⼝,那么就有⼀件很有趣的事情了,⼀个实现类可以实现多个接⼝,然后此时接⼝可以有选择的暴露实现类的部分⽅法,做到"窄化"实现类功能的⽬的。
当然例⼦还有很多,这些情况其实可以说是接⼝好处的体现,所以java有⾯向接⼝编程的建议,但是说回Service层⼀定要有接⼝吗?那到未必,因为说到底,多⼀个接⼝仅仅是扩展性和某些情况下有优
势,但是是否会⽤到接⼝的便利性,不确定的情况下我们未必⼀定要为"可能"买单,只是多写那⼏⾏代码,付出⼀点就可能避免"未来"的⼤"⿇烦",何乐⽽不为!?
下⾯简单列出Spring Boot中业务层(Service)的创建步骤及应⽤:
1. 接⼝及实现类命名⽅式,接⼝XXXService,实现类:XXXServiceImpl。
2. 实现类XXXServiceImpl需添加注解@Service,并指明名称,如@Service("companyService");
3. 在实现类中,通过注解@Autowired,注⼊数据仓库层Repository接⼝;
当实现的接⼝涉及数据库数据的删除或修改时,⽅法上⼀定要添加注解@Transactional,否则会执⾏不成功。spring到底是干啥的
⼆、如果该Service有多个实现类,它怎么知道该注⼊哪个ServiceImpl类?
1. 为每个service的impl都指定名称(使⽤@Service(“名称”))
2. Controller中注⼊service的时候使⽤名称来指定注⼊哪⼀个:
(1)@Autowired 按类型进⾏注⼊
@Autowired
@Qualifier("名称") 
(2)@Resource按名称进⾏注⼊
@Resource(name="名称")
例⼦:
service接⼝:
public interface HumanService {
public String name();
}
接⼝Impl实现类:
@Service("teacherService")
public class TeacherServiceImpl implements HumanService {
@Override
public String name(){
System.out.println("teacher");
return"teacher";
}
}
@Service("doctorService")
public class DoctorServiceImpl implements HumanService {
@Override
public String name(){
System.out.println("doctor");
return"doctor";
}
}
controller层:
@RestController
public class HumanController {
//    @Resource(name="doctorService")
@Autowired
@Qualifier("teacherService")
private HumanService humanService;
@RequestMapping("/name")
public String name(){
return humanService.name();
}
}
以上

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。