Spring注解@Controller和@Service一样吗?

Posted

技术标签:

【中文标题】Spring注解@Controller和@Service一样吗?【英文标题】:Is Spring annotation @Controller same as @Service? 【发布时间】:2013-04-10 10:13:10 【问题描述】:

Spring注解@Controller@Service一样吗?

我知道@Controller 可用于URL 映射和调用业务逻辑。

@Service 用于注解包含业务逻辑的服务类。

我可以使用@Controller 代替@Service 来注释Service 类吗?

【问题讨论】:

【参考方案1】:

不,它们彼此非常不同。

两者都是 @Component 注释的不同特化(实际上,它们是同一接口的两个不同实现),因此可以通过类路径扫描发现两者(如果您在 XML 中声明它配置)

@Service 注释用于您的服务层并注释执行服务任务的类,通常您不使用它,但在许多情况下您使用此注释来表示最佳实践。例如,您可以直接调用 DAO 类来将对象持久保存到数据库中,但这很糟糕。调用一个调用 DAO 的服务类是很不错的。执行关注点分离模式是一件好事。

@Controller注解是Spring MVC框架(用于实现Web应用程序的Spring框架组件)中使用的注解。 @Controller 注解表明一个特定的类充当控制器的角色。 @Controller 注解充当注解类的构造型,指示其角色。调度程序扫描这些带注释的类以查找映射方法并检测@RequestMapping 注释。

因此,查看 Spring MVC 架构,您有一个 DispatcherServlet 类(您在 XML 配置中声明),它代表一个前端控制器,它将所有 HTTP 请求分派到适当的控制器类(由 @Controller 注释)。此类通过其方法执行业务逻辑(并可以调用服务)。这些类(或其方法)通常还使用 @RequestMapping 注释来指定控制器及其方法处理的 HTTP 请求。

例如:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController 

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) 
        this.appointmentBook = appointmentBook;
    

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() 
        return appointmentBook.getAppointmentsForToday();
    

这个类是一个控制器。

这个类处理所有发往“/appointments”“文件夹”的HTTP请求,特别是get方法是处理所有发往文件夹“/appointments”的GET HTTP请求的方法。

我希望现在你更清楚了。

【讨论】:

很好的解释。值得一提的是,(at)controller 类不需要有 (at)RequestMapping,(at)RequestMapping 也可以是方法级别。 我可以将它们混合在单个类定义中吗?还是将它们作为单独的类实现更好?【参考方案2】:

如果你查看@Controller@Service注解的定义,你会发现这些是@Component注解的特殊类型。

@Component
public @interface Service 
    ….

 

@Component
public @interface Controller 
    …


那么有什么区别呢?

@Controller

@Controller 注释表示特定类充当控制器的角色。 @Controller 注解充当被注解类的原型,指示其角色。

@Controller 有什么特别之处?

您不能将此注释与@Service@Repository 之类的任何其他注释进行切换,即使它们看起来相同。 调度程序扫描带有@Controller 注释的类,并在其中检测@RequestMapping 注释。您只能在 @Controller 带注释的类上使用 @RequestMapping


@Service

@Services在repository层保存业务逻辑和调用方法。

@Service 有什么特别之处?

除了用来表示它持有业务逻辑之外,这个注解并没有提供明显的特殊性,但谁知道呢,spring 将来可能会添加一些额外的异常。

链接答案:What's the difference between @Component, @Repository & @Service annotations in Spring?

【讨论】:

【参考方案3】:

不,@Controller@Service 不同,尽管它们都是 @Component 的特化,因此它们都是类路径扫描发现的候选对象。 @Service 注解用于服务层,@Controller 用于表示层中的 Spring MVC 控制器。 @Controller 通常具有 URL 映射并由 Web 请求触发。

【讨论】:

【参考方案4】:

@Service 与 @Controller

@Service :类是“业务服务外观”(在核心 J2EE 模式意义上)或类似的东西。

@Controller : 表示带注释的类是“控制器”(例如 Web 控制器)。

---------找到关于主要刻板印象的有用注释 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@接口组件

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

表明一个带注释的类是一个组件。在使用基于注释的配置和类路径扫描时,此类类被视为自动检测的候选对象。

其他类级别的注释也可以被认为是标识一个组件,通常是一种特殊类型的组件:例如@Repository 注释或 AspectJ 的 @Aspect 注释。

@接口控制器

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

表示带注释的类是“控制器”(例如 Web 控制器)。

这个注解作为@Component 的一个特化,允许通过类路径扫描自动检测实现类。它通常与基于 RequestMapping 注解的注解处理程序方法结合使用。

@接口服务

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

表示带注释的类是“服务”,最初由域驱动设计(Evans,2003 年)定义为“作为独立于模型中的接口提供的操作,没有封装状态。” 也可能表明一个类是“业务服务外观”(在核心 J2EE 模式意义上),或类似的东西。此注释是通用的刻板印象,各个团队可以缩小其语义并酌情使用。

这个注解作为@Component 的一个特化,允许通过类路径扫描自动检测实现类。

@interface 存储库

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

表示带注释的类是“存储库”,最初由域驱动设计(Evans,2003 年)定义为“一种模拟对象集合的封装存储、检索和搜索行为的机制”。 实现传统 J2EE 模式(如“数据访问对象”)的团队也可以将此原型应用于 DAO 类,但在这样做之前应注意了解数据访问对象和 DDD 样式存储库之间的区别。此注释是通用的刻板印象,各个团队可以缩小其语义并酌情使用。

这样注释的类在与 PersistenceExceptionTranslationPostProcessor 结合使用时有资格进行 Spring DataAccessException 转换。还阐明了带注释的类在整个应用程序架构中的作用,用于工具、方面等目的。

从 Spring 2.5 开始,这个注解也作为 @Component 的一个特化,允许通过类路径扫描自动检测实现类。

【讨论】:

【参考方案5】:

我已经在这里Here is the Link回答了类似的问题

两者都不一样。

@Service 注释用于其他用途,@Controller 用于其他用途。 实际上 Spring 的 @Component、@Service、@Repository 和 @Controller 注解用于在 Spring 框架中使用类路径扫描进行自动 bean 检测,但它 并不意味着所有功能都是相同的。 @Service:表示注解的类是业务层的Service组件。

@Controller:注解类表示它是一个控制器组件,主要用于表现层。

【讨论】:

【参考方案6】:

您可以将 @service 声明为 @Controller

您可以@Controller 声明为 @Service

@Service

这是正常的。您只是将类声明为组件。

@Controller

它比组件更特别一点。 dispatcher 将在此处搜索 @RequestMapping。 因此,使用 @Controller 注释的类将另外有权声明通过其调用 API 的 URL

【讨论】:

【参考方案7】: 控制器将处理不同视图之间的导航。您的映射请求映射是在控制器的帮助下处理的。 服务直接与通常执行业务逻辑的存储库交互。您可以在服务层添加,删除,删除等

【讨论】:

【参考方案8】:

不,你不能他们是不同的。例如,在部署应用程序时,您的控制器映射将被破坏。

你为什么要这样做,控制器不是服务,反之亦然。

【讨论】:

【参考方案9】:

来自春天的行动

如你所见,这个类是用@Controller 注解的。就其本身而言,@Controller 并没有做太多的事情。其主要目的是将此类标识为组件扫描的组件。因为 HomeController 使用 @Controller 注解,所以 Spring 的组件扫描会自动发现它并在 Spring 应用程序上下文中创建 HomeController 的实例作为 bean。

事实上,一些其他注解(包括@Component、@Service 和@Repository)的用途类似于@Controller。您可以使用任何其他注释来有效地注释 HomeController,它仍然可以正常工作。然而,@Controller 的选择更能描述该组件在应用程序中的作用。

【讨论】:

【参考方案10】:

两者都是@Component注解的特殊形式。 @controller 和 @serviec 都共享 @component 注释的相同功能以及它们自己的功能。

@Controller 是一个类级别的注解,它将类标记为 Web 请求处理程序。进一步的解释可以参考这个网站:https://www.baeldung.com/spring-controller-vs-restcontroller

@Service 也是一个类级别的注解,它包含一个业务逻辑。 进一步的解释可以参考这个网站:https://www.baeldung.com/spring-component-repository-service

【讨论】:

以上是关于Spring注解@Controller和@Service一样吗?的主要内容,如果未能解决你的问题,请参考以下文章

@Component, @Controller, @Repository, @Service 有何区别?

Spring注解@Controller和@Service一样吗?

Spring Boot 事物回滚

spring的注解形式:@Repository@Service@Controller,

Spring MVC 常用注解@Controller,@RequestMapping,Model和ModelAndView

20191226 Spring官方文档(Core 1.10)