亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

@RestController 和 @Component 之間的細微差別

@RestController 和 @Component 之間的細微差別

眼眸繁星 2023-10-19 21:43:33
雖然網上每個頁面都說@RestController是@Component的規范,但我不知道它是否與DispatcherServlet有關。但是當我通過在 @RestController 和 @Component 之間切換來嘗試下面的代碼時,我沒有看到相同的行為:首先我嘗試使用@RestController:@RestComponentpublic class TestController {    @RequestMapping(value="/testController", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)    public void testController() {        System.out.println("Hello");    }}我在控制臺中得到以下輸出:你好其次我嘗試使用@Component + @ResponseBody:@Component@ResponseBodypublic class TestController {    @RequestMapping(value="/testController", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)    public void testController() {        System.out.println("Hello");    }}我在郵遞員上收到錯誤:{    "timestamp": 1570998345860,    "status": 405,    "error": "Method Not Allowed",    "message": "Request method 'POST' not supported",    "path": "/testController"}如果兩個注釋相同,那么為什么輸出存在差異?下面是 @RestController 和 @Controller 的源代碼,可以看出 @RestController 和 @Controller 都是 @Component 的規范:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Controller@ResponseBodypublic @interface RestController {}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Controller {}也許它必須與DispatcherServlet有關。Dispatcher Servlet 可能只檢查 @RestController 注解的類中的 URL。
查看完整描述

4 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

@Controller是傳統控制器中的用戶,引入@RestController注解是為了簡化RESTful Web服務的創建。這是一個結合了 @Controller 和 @ResponseBody 的便捷注解

@Controller 注釋只是 @Component 類的特化,允許通過類路徑掃描自動檢測實現類。

@Controller 通常與請求處理方法上使用的 @RequestMapping 注釋結合使用。

請求處理方法用@ResponseBody注釋。此注釋允許將返回對象自動序列化到 HttpResponse 中。

@RestController 是控制器的特殊版本。它包含 @Controller 和 @ResponseBody 注釋,因此簡化了控制器實現。

控制器使用 @RestController 注釋進行注釋,因此不需要 @ResponseBody。

控制器類的每個請求處理方法都會自動將返回對象序列化為 HttpResponse。

查看完整回答
反對 回復 2023-10-19
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

僅僅因為@RestController它是一個@Component并不意味著您可以通過切換到更廣泛的功能來實現相同的功能@Component。即使添加了@ResponseBody,您也無法實現等效的功能(如通過POST不支持的請求方法所表示的)。

替換@Component@Controller,因為 a與+@RestController具有完全相同的功能。您還可以在 的元注釋中看到這一點,您會看到它是元注釋的,而不僅僅是。反過來,用 進行元注釋。@Controller@ResponseBody@RestController@Controller@Component@Controller@Component


查看完整回答
反對 回復 2023-10-19
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

都是用注解進行元注解的@Controller注解。所有這些注釋本質上都是針對特定用例的注釋的專業化。該注解一般用于注冊Spring bean。@RestController@Service@Component@Component@Component

@Controller注解即使是用@Componentinside 進行注解的,它也提供了完全不同的功能。通過使用此注解來注解一個類,我們實際上是在告訴 spring 掃描此類中的@RequestMapping注解來注冊 bean 以進行請求映射。當您僅使用注釋時,不會發生這種情況@Component

當 spring 應用程序啟動時,DispatcherServlet將啟用(這是一個在s 上RequestMappingHandlerMapping?RequestMappingHandlerAdapter查找注釋的處理程序映射)。因此,當請求到達調度程序 servlet 時,它會將其交給將uri 解析為控制器方法 bean。5.x@RequestMapping@ControllerRequestMappingHandlerMappingDispatcherServlet?HandlerMapping

注意:在舊版本的 spring 中,DefaultAnnotationHandlerMapping?spring 啟用了此功能。

綜上所述:

  • @Component是任何 Spring 管理的組件或 bean 的通用構造型。

  • @Repository是持久層的構造型。

  • @Service是服務層的構造型。

  • @Controller是表示層(spring-MVC)的構造型。

@Controller注釋指示特定類充當控制器的角色。

注解的基本目的@Controller是充當被注解類的構造型,表明其作用。調度程序將掃描此類帶注釋的類以查找映射方法,檢測@RequestMapping注釋(請參閱下一節)。

帶注釋的控制器 bean 可以使用調度程序上下文中的標準 Spring bean 定義來顯式定義。然而,?@Controller構造型還允許自動檢測,與 Spring 2.5 對檢測類路徑中的組件類和自動注冊它們的 bean 定義的一般支持保持一致。


查看完整回答
反對 回復 2023-10-19
?
茅侃侃

TA貢獻1842條經驗 獲得超21個贊

您不應該得到相同的行為,因為 @Component 更通用。它僅將您的類注冊為 Spring Managed Bean。但是,@RestController 不僅將您的類注冊為托管 bean,還進一步將其注冊為對指定 URL 路徑的 HTTP 調用的入口點。其他特定于層的注釋(如 @Repository、@Configuration 等)也是如此



查看完整回答
反對 回復 2023-10-19
  • 4 回答
  • 0 關注
  • 292 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號