我正在使用 Spring 开发应用程序。我需要使用 @Service
注释。我有 ServiceI
和 ServiceImpl
这样 ServiceImpl implements ServiceI
。我很困惑我应该在哪里保留 @Service
注释。
我应该用 @Service
注释接口或实现吗?这两种方法有什么区别?
原文由 TheKojuEffect 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在使用 Spring 开发应用程序。我需要使用 @Service
注释。我有 ServiceI
和 ServiceImpl
这样 ServiceImpl implements ServiceI
。我很困惑我应该在哪里保留 @Service
注释。
我应该用 @Service
注释接口或实现吗?这两种方法有什么区别?
原文由 TheKojuEffect 发布,翻译遵循 CC BY-SA 4.0 许可协议
基本上像 @Service 、 @Repository 、 @Component 等注解。它们都服务于相同的目的:
使用基于注释的配置和类路径扫描时的自动检测。
根据我的经验,我总是在接口或抽象类上使用 @Service
注释以及 @Component
和 @Repository
等注释来实现它们。 @Component
我在那些服务于基本目的的类上使用的注释,简单的 Spring bean,仅此而已。 @Repository
我在 DAO
层中使用的注释,例如,如果我必须与数据库通信,进行一些交易等。
因此,我建议根据功能使用 @Service
和其他层来注释您的界面。
原文由 Paulius Matulionis 发布,翻译遵循 CC BY-SA 3.0 许可协议
1 回答2.6k 阅读✓ 已解决
4 回答2k 阅读
2 回答1.7k 阅读
2 回答1.4k 阅读
1 回答810 阅读✓ 已解决
1 回答1.2k 阅读
我从来没有把
@Component
(或@Service
,…)放在接口上,因为这会使接口无用。让我解释一下为什么。声明 1: 如果您有一个接口,那么您想将该接口用于注入点类型。
声明 2: 接口的目的是它定义了一个可以由多个实现实现的契约。在另一边你有你的注入点(
@Autowired
)。只有一个接口和一个实现它的类,(恕我直言)是无用的,并且违反了 YAGNI 。事实: 当你把:
@Component
(或@Service
,…)在接口处,然后你会得到和
NoUniqueBeanDefinitionException
(或者你有一个非常特殊的配置设置,带有环境,配置文件或限定符……)结论: 如果您在界面上使用
@Component
(或@Service
,…),那么您必须至少违反两个声明中的一个。因此,我认为将@Component
放在接口级别是没有用的(除了一些罕见的情况)。Spring-Data-JPA Repository 接口完全不同