在spring服务层使用继承是最佳实践吗?

web*_*pat 5 java spring design-patterns

我有两个名为PowerUserManager和 的服务 bean SimpleUserManager。两个带@Service注释的类都有大约20% 的代码是共同的

我已经构建了一个带有公共抽象类 ( BaseUserManager)的继承树,以减少两个类之间的冗余。

                               BaseUserManager
                                      |
                               ---------------
                               |             |
                       PowerUserManager  SimpleUserManager
Run Code Online (Sandbox Code Playgroud)

然后在我的@Controller或任何客户端类中,我使用@Autowired注释来注入两者PowerUserManagerSimpleUserManager并根据我正在处理的用户实例使用其中之一。

我不习惯使用继承来分解代码,尤其是在服务层。你们 Spring 伙伴们有没有看到更好的方法来做到这一点?

Szy*_*ski 3

在这种情况下,在考虑继承而不是组合之前,您应该问自己一些基本问题,一般来说

  1. 所有用户管理器都是BaseUserManager 吗?在任何可能的情况下,这都是 IS-A 关系吗?
  2. 在用户管理器涉及的任何地方公开 BaseUserManager 公共 API 是否有意义?
  3. BaseUserManager 是否有单一职责?

如果答案是肯定的,那么继承就是正确的选择。否则,您可能应该重新设计成几个较小的组件,并将 PowerUserManager 和 SimpleUserManager 视为服务外观。