今天咋们来看看Service接口的多实现,为什么会出现这种情况呢,大多数是需要经过同一端口Service来实现不同的功能,但是又不想暴露是在同一个接口进行处理的,那就需要用到啦。
那如何让spring来识别用哪一个实现类呢,这里有三个解决方案:
1.Controller中用@Autowired注入Service,然后使用@Qualifier("beanid")来指定相对应的实现类。
2.Controller中用@Resources(type = 类名.class)来指定相对应的实现类。
3.在实现类的上面使用@Service("名字"),然后在controller中使用Resouces(name = "你自定义的名字")
这三个方案实现的方式不一样,但是结果是一样的。
@Service注解的作用就是1.声明该类是一个bean(即在spring容器中注册),在使用@Autowired的时候可以作为一个成员变量自动注入。
三个方法中有@Autowired和@Resource两个注解。
1.@Autowired是spring的注解,@Resource是J2EE的注解。
2.@Autowired默认是通过byType进行Bean匹配,@Resource是通过byName进行Bean匹配。
3.@Autowired多了一个属性,就是它的依赖是可以为空的,但是默认情况下是必须存在的。(像这样@Autowired(required = false)
我来贴一下三个方法的实现代码吧
这里我以将授权和用户操作两个来做例子
方法1:
首先是两个实现类上要有@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('这里是你的实现类的类名')
IUserService userService;
···
方法2:
区别在于controller中的用法不一样
···
@Resource(''这里是你的实现类的类名.class')
IUserService userService;
···
方法3:
这里可以给你的实现类自定义名字哦,还是两个不同的实现类
@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;
···
结语
3个方法呢实现后的效果是差不多的,我的话是更偏向最后的一种,会更方便的让我去辨别哪一个接口,看起来也比较简约一些。
网友评论