2017-04-12 152 views
2

我在线阅读,@Service用于服务层(业务逻辑),@Controller用于API端点,而@Repository用于持久层。为什么@ DAO上的服务?

在我的公司,代码结构为:

Client -> Rest endpoint -> service -> DAO -> database 

什么困惑我的是,在DAO层,被注释为@Service(实际上两者的服务和DAO层也标注为@Service

是否有任何DAO注释为@Service的原因?我不能问程序员,因为他正在休假。

+0

http://stackoverflow.com/questions/35449808/what-will-happen-if-we-interchange-service-and-repository-annotation-in-the-sp – soorapadman

回答

5

使用@Component,@Repository,@Service和@Controller注释就绪并启用自动组件扫描后,spring将自动将bean导入到容器中,因此您无需明确定义它们以自动装入它们。

@Component

的@Component注释标记的Java类作为豆所以弹簧的组件的扫描机构可以把它捡起来,并将其拉入应用程序上下文。要使用此批注,应用它在类,如下:

@Repository

虽然上面使用@Component是不够好,但你可以用更合适的注解,专门为DAO的即@Repository提供了额外的好处注解。 @Repository注释是具有类似用法和功能的@Component注释的特化。除了将DAO导入到DI容器之外,它还会使未经检查的异常(从DAO方法抛出)有资格转换为Spring DataAccessException。

@Service

的@Service注解也是成分注释的特殊化。它目前不提供任何超过@Component注释的额外行为,但是在服务层类中使用@Service over @Component是个好主意,因为它更好地指定了intent。此外,工具支持和其他行为将来可能会依赖它。

@Controller

注解@Controller类标记为一个和Spring Web MVC控制器。它也是一个@Component特殊化,所以用它标记的bean会自动导入到DI容器中。将@Controller注释添加到类时,可以使用另一个注释,即@RequestMapping;将URL映射到类的实例方法。

在您的方案中,无论您使用@Service还是@Repository,它对应用程序流程都没有影响,应用程序将以他们有权自动装配的方式工作。但标准的做法是使用@Repository进行dao类。