美文网首页
Service接口多实现类

Service接口多实现类

作者: kacen | 来源:发表于2021-10-18 15:27 被阅读0次

    今天咋们来看看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个方法呢实现后的效果是差不多的,我的话是更偏向最后的一种,会更方便的让我去辨别哪一个接口,看起来也比较简约一些。

    相关文章

      网友评论

          本文标题:Service接口多实现类

          本文链接:https://www.haomeiwen.com/subject/xbxxoltx.html