小编典典

@Service 注释应该保存在哪里?接口还是实现?

all

我正在使用 Spring
开发应用程序。我需要使用@Service注释。我有ServiceIServiceImpl这样的ServiceImpl implements ServiceI。我对我应该在哪里保留@Service注释感到困惑。

我应该用 注释接口还是实现@Service?这两种方法有什么区别?


阅读 48

收藏
2022-08-08

共1个答案

小编典典

我从不将@Component(or @Service, …) 放在界面上,因为这会使界面无用。让我解释一下为什么。

权利要求 1: 如果您有一个接口,那么您想将该接口用于注入点类型。

权利要求 2: 接口的目的是定义一个可以由多个实现实现的契约。在另一边,您有您的注入点 (
@Autowired)。只有一个接口和一个实现它的类(恕我直言)是无用的,并且违反了YAGNI

事实: 当你放:

  • @Component(或@Service,…)在界面上,
  • 有多个实现它的类,
  • 至少有两个类成为 Spring Bean,并且
  • 有一个使用接口进行基于类型的注入的注入点,

然后你会得到和NoUniqueBeanDefinitionException (或者你有一个非常特殊的配置设置,带有环境、配置文件或限定符......)

结论:
如果您在界面上使用@Component(或@Service,…),那么您必须至少违反这两个规则之一。因此,我认为放在@Component接口级别是没有用的(除了一些罕见的场景)。


Spring-Data-JPA Repository 接口完全不同

2022-08-08