SpringMvc如何找到Controller

2021-08-22 06:20:57 字數 1552 閱讀 6212

最近乙個朋友,碰到了這樣乙個問題:

為什麼 springmvc 的必須定義為 controller,它是如何找到的?

當定義為@service時為什麼找不到,當定義為@service時,也想訪問怎麼辦?

我這邊首先貼出我找到的答案,然後給出我分析問題的思路

protected

boolean

ishandler(class> beantype)

判斷spring的bean必須是controller註解

@controller

public

class

indexcontroller

}

訪問/index頁面輸出 index page

訪問/service頁面輸出 service page

# 分析

分析之前假定以下條件

1. 會使用springmvc

2. 了解servlet生命週期

要分析出為什麼是controller註解,那麼首先在進行方法訪問時,找到建立物件的(集合/map),然後在去找使用集合的地方

## 逆向思維-controller物件建立

在例子中的 indexcontroller->index 斷點。 在呼叫堆疊中找到第一次使用indexcontroller類的地方

### 跟進hm.gethandler(request);
public final handlerexecutionchain gethandler(httpservletrequest request) throws exception

### 跟進gethandlerinternal

這是乙個抽象方法,需要重啟伺服器,然後debug步進

### 跟進lookuphandlermethod
}

找到了indexcontroller物件所屬的集合: `org.springframework

.web

.servlet

.handler

## 逆向思維-對映註冊中心的註冊攔截.

}

.register`斷點, 重啟伺服器之後,進行堆疊分析

### 載入bean相關方法

protected void detecthandlermethods(final object handler)

}@override

protected boolean ishandler(class> beantype)

直到這裡才終於找到我們想要了解的內容: springmvc 為什麼只找controller註解,而不找其他的

在我們了解 springmvc 的全貌時,自然不用這種逆推的手段來了解我們想要的內容

但是當我們想要了解具體某個東西的時候,可以猜測它的實現,再去逆向分析就可以快速的得到我們想要的結果

SpringMVC 如何將請求找到匹配的處理方法

在springmvc的模式下,瀏覽器的乙個請求是如何對映到指定的controller的呢?在web伺服器啟動時,spring容器中會儲存乙個map的資料結構,裡邊記錄這controller和url請求中的對應關係。那麼這個map中的資料是如何來的呢?protected void inithandle...

如何找到自我

做自己想做的事 走自己想走的路不是一件容易的事。但是不了解自己,又如何能夠做你自己呢?如果你從來沒有認真想過你是怎樣乙個人,而你又想知道自己的定位。那麼下面的內容可能會對你有所幫助。忘記別人認為你應該怎麼做。找到你自己最大的障礙在於,你總是覺得應該按照別人的模式做。但是,你要想做乙個快樂的人,就不能...

如何理解SpringMVC

如何理解springmvc 一,首先是乙個mvc框架。在web模型中,mvc是一種很流行的框架,通過把model,view,controller分離,把較為複雜的web應用分成邏輯清晰的幾部分,是為了簡化開發,減少出錯。還是為了組內開發人員之間的配合。總之就是一種分層工作的辦法。二,springmv...