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

Ket*_*tan 74 service spring controller

Spring注释是@Controller一样的@Service吗?

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

@Service用来注释包含业务逻辑服务类.

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

And*_*ili 111

不,他们彼此差异很大.

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

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

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

所以,看你有一个的DispatcherServlet类(您在XML配置声明),它表示对派遣适当的控制器类中的所有HTTP请求(由@Controller的)前端控制器的Spring MVC架构.此类通过其方法执行业务逻辑(并可以调用服务).这些类(或其方法)通常也使用@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();
    }
Run Code Online (Sandbox Code Playgroud)

这个类是一个控制器.

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

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

  • 非常好的解释.值得一提的是,(at)控制器类不需要(at)RequestMapping,(at)RequestMapping也可以是方法级别. (3认同)
  • 我可以将它们混合在单个类定义中吗?或者将它们作为单独的类实现更好? (2认同)

Ram*_*asi 34

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

@Component
public @interface Service {
    ….
}
Run Code Online (Sandbox Code Playgroud)

 

@Component
public @interface Controller {
    …
}
Run Code Online (Sandbox Code Playgroud)

那有什么区别?

@Controller

@Controller注解表明特定类供应控制器的作用.该@Controller注释充当注解类刻板印象,这表明它的作用.

@Controller有什么特别之处?

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


@服务

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

@Service有什么特别之处?

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

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


Nil*_*lsH 7

不,@Controller不一样@Service,虽然它们都是专业化的@Component,因此它们都是通过类路径扫描发现的候选者.该@Service注释在服务层使用,并且@Controller是在表示层Spring MVC控制器.一个@Controller典型的将有一个URL映射,并通过一个Web请求被触发.


小智 5

@Service 与 @Controller

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

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

----------查找有关主要构造型的有用说明 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
Run Code Online (Sandbox Code Playgroud)

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

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

@接口控制器

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller
Run Code Online (Sandbox Code Playgroud)

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

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

@接口服务

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service
Run Code Online (Sandbox Code Playgroud)

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

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

@interface 存储库

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository
Run Code Online (Sandbox Code Playgroud)

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

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

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