应该在哪里保存@Service注释? 接口还是实现?
我正在使用Spring开发应用程序。 我需要使用@Service
注释。 我有ServiceI
和ServiceImpl
,使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时,在任何其他情况下使用它