我从不将
@Component(或
@Service…)放在界面上,因为这会使界面无用。让我解释一下原因。
声明1:如果你有一个接口,那么你想将该接口用于注入点类型。
权利要求2:接口的目的是它定义可以由几种实现方式实现的协定。在另一侧,你有注射点(
@Autowired)。(IMHO)仅具有一个接口且只有一个实现该接口的类是无用的,并且违反了YAGNI。
事实:当你放:
@Component
(或@Service
,…)在界面上,- 有多个实现它的类,
- 至少有两个类成为Spring Bean,并且
- 有一个使用该接口进行基于类型的注入的注入点,
那么你将获得和
NoUniqueBeanDefinitionException(或者你具有非常特殊的配置设置,包括环境,配置文件或限定符…)
结论:如果在接口上使用
@Component(或
@Service,…),则必须违反两个规则中的至少一个。因此,我认为将其放在
@Component接口级别上是没有用的(除了一些罕见的情况)。



