我正在使用 Spring 开发应用程序。我需要使用@Service注释。我有ServiceI和ServiceImpl这样的ServiceImpl implements ServiceI。我对我应该在哪里保留@Service注释感到困惑。
@Service
ServiceI
ServiceImpl
ServiceImpl implements ServiceI
我应该用 注释接口还是实现@Service?这两种方法有什么区别?
我从不将@Component(or @Service, …) 放在界面上,因为这会使界面无用。让我解释一下为什么。
@Component
权利要求 1: 如果您有一个接口,那么您想将该接口用于注入点类型。
权利要求 2: 接口的目的是定义一个可以由多个实现实现的契约。在另一边,您有您的注入点 ( @Autowired)。只有一个接口和一个实现它的类(恕我直言)是无用的,并且违反了YAGNI。
@Autowired
事实: 当你放:
然后你会得到和NoUniqueBeanDefinitionException (或者你有一个非常特殊的配置设置,带有环境、配置文件或限定符......)
NoUniqueBeanDefinitionException
结论: 如果您在界面上使用@Component(或@Service,…),那么您必须至少违反这两个规则之一。因此,我认为放在@Component接口级别是没有用的(除了一些罕见的场景)。
Spring-Data-JPA Repository 接口完全不同