Spring注释@Controller与@Service相同吗?

问题描述 投票:63回答:7

春天注释@Controller@Service一样吗?

我有关于@Controller的想法,它可以用于URL映射和调用业务逻辑。

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

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

spring service controller
7个回答
106
投票

不,他们彼此差异很大。

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

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

@Controller注释是Spring MVC框架(用于实现Web应用程序的Spring Framework的组件)中使用的注释。 @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();
    }

这个类是一个控制器。

此类处理所有对“/ appointment”“文件夹”的HTTP请求,特别是get方法是调用处理文件夹“/ appointment”的所有GET HTTP请求的方法。

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


30
投票

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

@Component
public @interface Service {
    ….
}

@Component
public @interface Controller {
    …
}

那有什么区别?

@Controller

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

@Controller有什么特别之处?

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


@服务

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

@Service有什么特别之处?

除了它用于表明它持有业务逻辑这一事实之外,这个注释没有明显的特点,但是谁知道,spring可能在未来增加一些额外的特殊功能。

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


7
投票

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


4
投票

@Service vs @Controller

@Service:class是一个“Business Service Facade”(在Core J2EE模式意义上),或类似的东西。

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

----------查找有关主要刻板印象的有用说明qazxsw poi

@interface组件

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

表示带注释的类是组件。当使用基于注释的配置和类路径扫描时,这些类被视为自动检测的候选者。

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

@interface控制器

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

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

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

@interface服务

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

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

此注释用作@Component的特化,允许通过类路径扫描自动检测实现类。

@interface存储库

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

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

当与PersistenceExceptionTranslationPostProcessor一起使用时,这样注释的类有资格进行Spring DataAccessException转换。为了工具,方面等目的,注释类还阐明了它在整个应用程序体系结构中的作用。

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


1
投票

我已经在这里回答了类似的问题@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Repository

两者都不相同。

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

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


0
投票

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

无论如何,你为什么要控制器不是服务,反之亦然。


0
投票

从Spring In Action

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

实际上,一些其他注释(包括@ Component,@ Service和@Repository)的用途与@Controller类似。您可以使用任何其他注释同样有效地注释HomeController,它仍然可以使用相同的。但是,@ Controller的选择更能描述该组件在应用程序中的作用。

© www.soinside.com 2019 - 2024. All rights reserved.