最近乙個朋友,碰到了這樣乙個問題:
為什麼 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...