zoukankan      html  css  js  c++  java
  • [转]what’s the difference between @Component ,@Repository & @Service annotations in Spring

    原文地址:https://www.cnblogs.com/softidea/p/6070314.html

    @Component is equivalent to

    <bean>

    @Service, @Controller , @Repository = {@Component + some more special functionality}

    That mean Service,Controller and Repository are functionally the same.

    The three annotations are used to separate "Layers" in your application,

    • Controllers just do stuff like dispatching, forwarding, calling service methods etc.
    • Service Hold business Logic, Calculations etc.
    • Repository are the DAOs(Data Access Objects), they access the database directly.

    Now you may ask why separate them:(I assume you know AOP-Aspect Oriented Programming)

    Lets say you want to Monitors the Activity of the DAO Layer only. You will write an Aspect(A class) class that does some logging before and after every method of your DAO is invoked, you are able to do that using AOP as you have three distinct Layers and are not mixed.

    So you can do logging of DAO "around", "before" or "after" the DAO methods. You could do that because you had a DAO in the first place. What you just achieved is Separation of concerns or tasks.

    Imagine if there were only one annotation @Controller, then this component will have dispatching, business logic and accessing database all mixed, so dirty code!

    Above mentioned is one very common scenario, there are many more use cases of why to use three annotations.

    In Spring @Component, @Service, and @Controller. @Component are Stereotype annotations which is used for:

    @Controller: where your request mapping from presentation page done i.e. Presentation layer won't go to any other file it goes directly to @Controller class and check for requested path in @RequestMapping annotation which written before method calls if necessary.

    @Service: All business logic is here i.e. Data related calculations and all.This annotation of business layer in which our user not directly call persistence method so it will call this methods using this annotation. It will request @Repository as per user request

    @Repository:This is Persistence layer(Data Access Layer) of application which used to get data from database. i.e. all the Database related operations are done by repository.

    @Component - Annotate your other components (for example REST resource classes) with component stereotype.

    From Spring Documentation:

    In Spring 2.0 and later, the @Repository annotation is a marker for any class that fulfills the role or stereotype (also known as Data Access Object or DAO) of a repository. Among the uses of this marker is the automatic translation of exceptions.

    Spring 2.5 introduces further stereotype annotations: @Component, @Service, and @Controller. @Component is a generic stereotype for any Spring-managed component. @Repository, @Service, and @Controller are specializations of @Component for more specific use cases, for example, in the persistence, service, and presentation layers, respectively.

    Therefore, you can annotate your component classes with @Component, but by annotating them with @Repository, @Service, or @Controller instead, your classes are more properly suited for processing by tools or associating with aspects. For example, these stereotype annotations make ideal targets for pointcuts.

    Thus, if you are choosing between using @Component or @Service for your service layer, @Service is clearly the better choice. Similarly, as stated above, @Repository is already supported as a marker for automatic exception translation in your persistence layer.

    | Annotation | Meaning                                             |
    +------------+-----------------------------------------------------+
    | @Component | generic stereotype for any Spring-managed component |
    | @Repository| stereotype for persistence layer                    |
    | @Service   | stereotype for service layer                        |
    | @Controller| stereotype for presentation layer (spring-mvc)      |

    Spring 2.5 introduces further stereotype annotations: @Component, @Service and @Controller. @Component serves as a generic stereotype for any Spring-managed component; whereas, @Repository, @Service, and @Controller serve as specializations of @Component for more specific use cases (e.g., in the persistence, service, and presentation layers, respectively). What this means is that you can annotate your component classes with @Component, but by annotating them with @Repository, @Service, or @Controller instead, your classes are more properly suited for processing by tools or associating with aspects. For example, these stereotype annotations make ideal targets for pointcuts. Of course, it is also possible that @Repository, @Service, and @Controller may carry additional semantics in future releases of the Spring Framework. Thus, if you are making a decision between using @Component or @Service for your service layer, @Service is clearly the better choice. Similarly, as stated above, @Repository is already supported as a marker for automatic exception translation in your persistence layer.

    @Component – Indicates a auto scan component.  
    @Repository – Indicates DAO component in the persistence layer.  
    @Service – Indicates a Service component in the business layer.   
    @Controller – Indicates a controller component in the presentation layer.

    reference :- http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s12.html


             总的来说就是 @Service, @Controller , @Repository = {@Component + 特殊的功能} ,文章提到我们应该结合Spring中到的切面编程思想(AOP), 我们的controller 承担着分发请求的任务后,又要处理业务逻辑,同时还要与数据库持久层作交互,这样的代码是糟糕的,所以文档中主张是使用这几个注解类,更好地区分开各自的功能

    • @Component : 将自动扫描组件
    • @Repository :  指示为在持久层的Dao层的组件(它的好处是捕抓到持久层交互中出现的异常,并把异常友好地表示出来,假如没有这个注释,数据库抛出的异常常常难以理解)
    • @Service : 业务逻辑
    • @Controller : 分发请求
  • 相关阅读:
    并发编程与高并发学习笔记六
    并发编程与高并发学习笔记五
    并发编程与高并发学习笔记四
    浅谈数据挖掘与机器学习
    IntelliJ Idea常用的快捷键
    单链表的插入,查找,删除
    二叉树的序列化和反序列化及完全二叉树和满二叉树的区别
    二叉树的按层遍历并实现换行
    冒泡排序,选择排序,插入排序,快速排序的比较及优化
    axSpA患者新发炎症更容易发生在既往发生过炎症的区域
  • 原文地址:https://www.cnblogs.com/Benjious/p/9307736.html
Copyright © 2011-2022 走看看