今天咋們來看看Service接口的多實(shí)現(xiàn),為什么會出現(xiàn)這種情況呢,大多數(shù)是需要經(jīng)過同一端口Service來實(shí)現(xiàn)不同的功能,但是又不想暴露是在同一個接口進(jìn)行處理的,那就需要用到啦瞬痘。
那如何讓spring來識別用哪一個實(shí)現(xiàn)類呢,這里有三個解決方案:
1.Controller中用@Autowired注入Service,然后使用@Qualifier("beanid")來指定相對應(yīng)的實(shí)現(xiàn)類肛根。
2.Controller中用@Resources(type = 類名.class)來指定相對應(yīng)的實(shí)現(xiàn)類。
3.在實(shí)現(xiàn)類的上面使用@Service("名字"),然后在controller中使用Resouces(name = "你自定義的名字")
這三個方案實(shí)現(xiàn)的方式不一樣,但是結(jié)果是一樣的狼荞。
@Service注解的作用就是1.聲明該類是一個bean(即在spring容器中注冊),在使用@Autowired的時候可以作為一個成員變量自動注入。
三個方法中有@Autowired和@Resource兩個注解帮碰。
1.@Autowired是spring的注解,@Resource是J2EE的注解相味。
2.@Autowired默認(rèn)是通過byType進(jìn)行Bean匹配,@Resource是通過byName進(jìn)行Bean匹配。
3.@Autowired多了一個屬性,就是它的依賴是可以為空的,但是默認(rèn)情況下是必須存在的殉挽。(像這樣@Autowired(required = false)
我來貼一下三個方法的實(shí)現(xiàn)代碼吧
這里我以將授權(quán)和用戶操作兩個來做例子
方法1:
首先是兩個實(shí)現(xiàn)類上要有@Service注解
分別是UserAccessServiceImpl丰涉,UserServiceImpl
@Service
public class UserAccessServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
然后來到controller
···
@Autowired
@Qualifier('這里是你的實(shí)現(xiàn)類的類名')
IUserService userService;
···
方法2:
區(qū)別在于controller中的用法不一樣
···
@Resource(''這里是你的實(shí)現(xiàn)類的類名.class')
IUserService userService;
···
方法3:
這里可以給你的實(shí)現(xiàn)類自定義名字哦,還是兩個不同的實(shí)現(xiàn)類
@Service("UserAccessService")
public class UserAccessServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
@Service("UserServiceImpl")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
然后我們到controller來指定使用哪個
···
@Resource(name = "UserAccessService")
IUserService userService;
···
結(jié)語
3個方法呢實(shí)現(xiàn)后的效果是差不多的,我的話是更偏向最后的一種,會更方便的讓我去辨別哪一個接口,看起來也比較簡約一些斯碌。