84

Spring注解是否@Controller相同@Service

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

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

我可以使用@Controller而不是@Service注释服务类吗?

4

10 回答 10

136

不,它们彼此非常不同。

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

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

@Controller注解是 Spring MVC 框架中使用的注解(Spring 框架中用于实现 Web 应用程序的组件)。@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 请求而调用的方法。

我希望现在对你来说更清楚了。

于 2013-04-10T12:30:16.393 回答
42

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

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

那么有什么区别呢?

@控制器

@Controller注释表明一个特定的类充当控制器的角色。@Controller注释充当被注释类的构造型,指示其角色。

@Controller 有什么特别之处?

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


@服务

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

@Service 有什么特别之处?

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

链接答案:Spring 中的 @Component、@Repository 和 @Service 注释有什么区别?

于 2016-08-24T10:23:55.250 回答
7

不,@Controller与 不同@Service,尽管它们都是 的特化@Component,使它们都成为通过类路径扫描发现的候选者。@Service注释用于您的服务层,用于@Controller表示层中的 Spring MVC 控制器。A@Controller通常会有一个 URL 映射并由 Web 请求触发。

于 2013-04-10T10:21:00.553 回答
5

@Service 与 @Controller

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

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

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

@interface 组件

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

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

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

@接口控制器

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

表示一个带注释的类是一个“控制器”(例如一个网络控制器)。

这个注解作为@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 的一个特化,允许通过类路径扫描自动检测实现类。

于 2016-07-03T06:51:39.470 回答
1

我已经在这里回答了类似的问题这是链接

没有两者是不同的。

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

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

于 2014-10-03T06:19:16.847 回答
1

您可以将@service声明为@Controller

不能将@Controller声明为@Service

@服务

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

@控制器

它比 Component 稍微特别一点。调度程序将在此处搜索@RequestMapping。因此,使用 @Controller 注释的类将另外被授权声明通过其调用 API 的 URL

于 2019-11-20T06:47:58.427 回答
1
  • 控制器将处理不同视图之间的导航。您的映射请求映射是在控制器的帮助下处理的。
  • 服务直接与通常执行业务逻辑的存储库进行交互。您可以在服务层添加,删除,删除等
于 2020-06-24T04:33:36.663 回答
0

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

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

于 2013-04-10T10:17:58.757 回答
0

从春天在行动

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

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

于 2019-04-02T01:32:32.010 回答
0

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

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

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

于 2021-10-14T07:11:48.440 回答