我正在开发使用Spring的应用程序。 我需要使用@Service
注解。 我有ServiceI
和ServiceImpl
这样ServiceImpl implements ServiceI
。 我很困惑,此间我应该在哪里保持@Service
注解。
我应该注释接口或与实施@Service
? 什么是这两种方法之间的差异?
我正在开发使用Spring的应用程序。 我需要使用@Service
注解。 我有ServiceI
和ServiceImpl
这样ServiceImpl implements ServiceI
。 我很困惑,此间我应该在哪里保持@Service
注解。
我应该注释接口或与实施@Service
? 什么是这两种方法之间的差异?
我从来不把@Component
(或@Service
,...)在一个接口,因为这使界面没用。 让我来解释为什么。
权利要求1:如果你有一个接口,那么要使用该接口用于注射点的类型。
如权利要求2:接口的目的是,它定义可由若干实施方式中实现的合同。 在另一边你有你的注入点( @Autowired
)。 有一个接口,只有一个实现它的类,是(恕我直言)没用,违反YAGNI 。
事实:当你地说:
@Component
(或@Service
,...)在界面处, 那么你会得到和NoUniqueBeanDefinitionException
(或者你有一个非常特殊的配置设置,环境,配置文件或预选赛...)
结论:如果你使用@Component
(或@Service
在一个接口,...),那么你必须违反两个clains的至少一个。 因此,我认为这是没有用的(除了某些罕见的情况下),把@Component
在接口级。
Spring的数据存储库JPA接口都完成的东西不同
基本上注解像@服务 , @Repository , @Component等,它们都达到同样的目的:
使用基于注解的配置和类路径扫描时自动检测。
从我的经验我一直在使用@Service
在接口或抽象类和注解像注释@Component
和@Repository
组织落实。 @Component
注释我使用,供应基本的目的,简单的Spring bean,仅此而已这些类。 @Repository
注解我使用在DAO
层,例如,如果我要传达到数据库中,有一些交易,等等。
所以我建议注释与您的接口@Service
和其它层根据各自的功能。
我用@Component,@Service,@Controller和@Repository注解只在实现类,而不是接口。 但随着接口@Autowired注解仍然为我工作。
把注释上@Service的优点是,它给出了一个提示,是一种服务。 我不知道是否有实现的类将默认继承这个annoation。
精读的一面是,你是耦合与特定的框架,即春季的接口,通过使用特定的春天注解。 由于接口都应该是从实现分离,我不会建议使用任何框架的具体注解或您的接口的对象部分。
弹簧的一个优点是容易地切换服务(或其他)实现。 对于这一点,你需要注释的接口上,并声明变量是这样的:
@Autowired
private MyInterface myVariable;
并不是 :
@Autowired
private MyClassImplementationWhichImplementsMyInterface myVariable;
像第一种情况下,你可以激活的那一刻起它是独一无二的注入,其实现(只有一个类实现了接口)。 在第二种情况下,你需要重构所有的代码(新类的实现还有另一个名字)。 因此,注释必须在接口上尽可能多地。 此外,JDK代理是非常适合这样的:他们创建和应用程序启动时实例化,因为运行时类型是预先知道,违背CGLIB代理。
简而言之:
@Service是服务层构造型注释。
@Repository是用于持久层构造型注释。
@Component是用来告诉Spring的应用程序上下文创建对象实例的通用形式标注。 这有可能为实例定义的任何名称,默认为类名作为骆驼。
有可能被用于制作春季豆5个注解。 列出下面的答案。
你真的需要一个接口? 如果你要为每个服务接口一个实现,只是避免它,只能使用类。 当然,如果你没有RMI或当需要接口代理。
@Repository - 用于注入你的DAO层类。
@服务 - 使用注入你的服务层类。 在服务层还您可能需要使用@Transactional注释对数据库的事务管理。
@Controller - 使用您的前端层控制器,例如JSF管理豆注入作为弹簧豆。
@RestController - 使用了弹簧安置控制器,这将帮助您避免每次放和@ResponseBody @RequestBody标注在你的休息时间的方法。
@Component - 用它在任何其他情况下,当你需要注入的Spring bean未被控制器,服务或DAO类