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

我正在使用Spring开发应用程序。 我需要使用@Service注释。 我有ServiceIServiceImpl ,使ServiceImpl implements ServiceI 。 我很困惑,在哪里应该保留@Service注释。

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

基本上像@ Service , @ Repository , @Component等注释,他们都服务于相同的目的:

使用基于注释的configuration和类path扫描时自动检测。

根据我的经验,我总是在接口上使用@Service注释,或者像@Component@Repository这样的抽象类和注释来实现它们。 @Component注释我正在使用那些为基本目的的类,简单的Spring Bean,仅此而已。 @Repository注解我在DAO层使用,例如,如果我必须与数据库通信,有一些交易等。

所以我build议用@Service和其他图层注释你的接口,具体取决于function。

我从来没有把@Component (或@Service ,…)放在一个接口上,因为这会使接口无用。 让我解释一下为什么。

要求1:如果你有一个接口,那么你想使用该接口的注入点types。

权利要求2:接口的目的是定义可以通过多种实现来实现的合同。 另一方面,你有注射点( @Autowired )。 只有一个接口,只有一个类实现它,是(恕我直言)没用,违反了YAGNI 。

事实:当你把:

  • @Component (或@Service ,…)在一个接口,
  • 有多个类来实现它,
  • 至less有两个class级成为春豆,
  • 有一个注入点使用基于types的注入接口,

那么你将得到和NoUniqueBeanDefinitionException (或者你有一个非常特殊的configuration设置,与环境,configuration文件或限定符…)

结论:如果你在界面上使用@Component (或者@Service ,…),那么你必须至less违反两个clains中的一个。 因此,我认为这是没有用的(除了一些罕见的情况下)把@Component在接口级别。


Spring-Data-JPA Repository接口是完全不同的东西

我只在实现类上使用@Component,@Service,@Controller和@Repository注释,而不是在接口上。 但是使用Interfaces的@Autowired注解仍然适用于我。

将注释放在@Service上的优点是它提示它是一个服务。 我不知道是否有任何实现类将默认inheritance这个annoation。

可以肯定的是,通过使用特定于Spring的注释,您可以将您的接口与特定的框架(即Spring)耦合。 由于接口应该与实现分离,我不会build议使用任何框架特定的注释或接口的对象部分。

简而言之:

@Service服务层的一个Stereotype注解。

@Repository是 持久层的一个Stereotype注解。

@Component是一个通用的构造型注释,用于告诉Spring在Application Context中创build对象的一个​​实例。 可以为实例定义任何名称,默认的类名是骆驼大小写。

有5个可用于制作春豆的注释。 列出下面的答案。

你真的需要一个界面吗? 如果你要为每个服务接口实现一个实现,只要避免它,只使用类。 当然,如果你没有RMI或需要接口代理的话。

@Repository – 用于注入你的dao图层类。

@Service – 用于注入你的服务层类。 在服务层也可能需要使用@Transactional注释来进行数据库事务pipe理。

@Controller – 用于您的前端图层控制器,如JSFpipe理的bean注入为spring bean。

@RestController – 用于弹簧rest控制器,这将帮助你避免每次把@ResponseBody和@RequestBody注释在你的rest方法。

@Component – 当你需要注入不是控制器,服务或dao类的spring bean时,在任何其他情况下使用它