五分鐘學Java:一篇文章搞懂spring和springMVC
原創宣告
本文首發於微信公眾號【程式設計師黃小斜】
本文作者:黃小斜
轉載請務必在文章開頭註明出處和作者。
本文思維導圖
什麼是Spring,為什麼你要學習spring?
你第一次接觸spring框架是在什麼時候?相信很多人和我一樣,第一次瞭解spring都不是做專案的時候用到,而是在網上看到或者是聽到過一個叫做spring的框架,這個框架號稱完爆之前的structs和structs2,吸引了不少人的注意。
那麼,spring到底有沒有神奇呢,據記載,spring框架出現的時間是在2002年,當時的人們對於繁瑣笨重的EJB框架詬病不已,而且對於structs這類框架也沒有什麼好感,這個時候spring從天而,救一大批Java開發者於水火之中。
讓我們先看看百度百科對於spring的定義,Spring框架是由於軟體開發的複雜性而建立的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合性角度而言,絕大部分Java應用都可以從Spring中受益。
◆目的:解決企業應用開發的複雜性
◆功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能
◆範圍:任何Java應用
Spring是一個輕量級控制反轉(IoC)和麵向切面(AOP)的容器框架。
spring框架解決了程式設計師在Java開發中長期存在的兩個痛點,那就是bean管理和統一切面,而spring的IOC和AOP恰好解決了這兩個問題。
其實,spring生態中的內容豐富多彩,除了上圖提到的這些模組,如今spring已經發展到了springboot和springcloud,為微服務等後端技術棧提供非常優質的解決方案。
如今,spring框架已經成為Java程式設計師必知必會的內容了,那麼如何開始學習spring框架,就成為了我們今天要討論的主題。
首先,先來看看spring基礎部分應該如何學習。
spring基礎
spring的核心就是IOC和AOP了,把這兩點搞懂,你就可以說自己學會了spring(然而並不是)
首先來看看IOC,IOC的本質就是把bean的管理交給框架去做,spring自己維護一個bean容器,將所有bean進行統一管理,這樣一來,所有需要用到例項的場景都不需要寫繁瑣且重複的例項化程式碼,而是簡單地完成bean宣告和注入依賴就可以了。
舉個簡單的例子。
假如沒有spring的IOC,我們管理例項時可能很不方便,比如下面這段程式碼,我們必須要在構造方法裡對userService和bookservice進行例項化,並且注入相應的依賴,否則它自己是沒有辦法完成初始化的。甚至,我們在使用controller的時候還要自己對它進行例項化。
class QueryController{
UserService userService;
BookService bookservice;
QueryController() {
userService = new UserService;
userService.setUserDao(new UserDap());
bookservice = new BookService;
bookservice.setBookDao(new BookDao());
}
public static void main(Strings[] args) {
QueryController queryController = new QueryController();
}
}
一旦我們使用了spring框架,利用它的依賴注入功能,就可以省掉一大堆事情。如下面的程式碼所示。
@Controller
class QueryController{
@Autowired
UserService userService;
@Autowired
BookService bookservice;
}
當然,我們這裡還用了spring提供的註解功能,比如
@Controller這個註解,可以把一個類宣告成一個controller,spring的bean容器對它進行例項化,並且按照controller來進行特殊處理,而@
Autowired這個註解,則可以把userService和bookservice的例項都注入到QueryController裡,而這一切,都是因為spring的IOC幫你實現了bean管理。
當然了,userService和bookservice本身也可以把自己對應的dao層依賴(持久層)通過IOC方式進行注入。
說完了IOC,再來看看AOP是如何實現的吧。
AOP的本質是利用動態代理完成統一切面的功能,利用AOP,我們可以把一些橫向的同一型別程式碼進行復用,比如登入攔截,身份校驗,安全管理等等,這些不需要內嵌到業務程式碼中,但卻經常要用到的東西,就可以利用AOP來做成一個切面,然後指定需要攔截的方法,AOP通過動態代理會將切面程式碼加入到代理物件中,於是你執行業務程式碼時,相當於在執行代理物件,就會相應地呼叫切面方法。
一個最簡單的動態代理實現如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method);
if (method.getName().equals("morning")) {
System.out.println("Good morning, " + args[0]);
}
return null;
}
};
Hello hello = (Hello) Proxy.newProxyInstance(
Hello.class.getClassLoader(), // 傳入ClassLoader
new Class[] { Hello.class }, // 傳入要實現的介面
handler); // 傳入處理呼叫方法的InvocationHandler
hello.morning("Bob");
}
}
interface Hello {
void morning(String name);
}
結果將會輸出
public abstract void test.Hello.morning(java.lang.String)
Good morning, Bob
其中InvocationHandler就是代理類的程式碼,而AOP就是機遇動態代理來實現的,你可以自由發揮,在代理類裡使用你自己想要的程式碼。
其實,除了IOC和AOP之外,spring裡還有很多我們經常在用的元件和模組,比如事務,比如JDBC,再比如JMS(訊息服務)等等,這些常用的技術元件都被整合到了spring框架中,非常便於我們的使用。
springmvc
講完了spring,接下來就該聊聊springmvc了,
據百度百科介紹,Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面。Spring 框架提供了構建 Web 應用程式的全功能 MVC 模組。使用 Spring 可插入的 MVC 架構,從而在使用Spring進行WEB開發時,可以選擇使用Spring的Spring MVC框架或整合其他MVC開發框架,如Struts1(現在一般不用),Struts 2(一般老專案使用)等。
作為一個web開發者,光有spring的AOP和IOC恐怕還無法支援你開發出一個頁面,springmvc的作用就是為了幫你實現最高效的web開發,告別structs框架。
簡單來說,springmvc提供了一套典型的mvc開發模式,m也就是model層,負責提供資料模型,以及和資料庫進行互動,而C代表的是controller,負責分發和處理web請求,這裡指的是HTTP請求,一般的controller會處理對應url的web請求,並且返回相應的內容,而在返回內容的這部分功能,則需要v也就是view層來提供了,畢竟頁面的渲染是很麻煩的一件事情,返回物件可能是文字,可能是json,也可能是一個html頁面,view層就用於處理這些工作。
MVC的開發模式確實解決了web工程師的很多問題,springmvc作為mvc框架的先行者也很自然地成為了Java中的霸主。
隨著Java技術的發展和更迭,如今Java能做的事情已經遠不止web開發了,現在流行的微服務、中介軟體很多都是用Java來實現的,而spring生態自然也會隨之發展,由此出現的springboot、springcloud也已經成為了業界的開源框架的標杆。
時間有限,剩餘的內容我們將會在以後繼續推出,敬請期待。
推薦資源
spring的書籍、視訊教程其實都很多,這裡挑選一些我認為還不錯的推薦給大家。
其實,spring最好的技術資源就在官方: https://spring.io/
英文好的同學不妨直接去看官方文件。
書籍
Spring Boot實戰 ,丁雪豐 (譯者)
Spring原始碼深度解析
視訊
這裡我整理了一些還算不錯的視訊資源分享給大家,具體請在公眾號【程式設計師黃小斜】內回覆“spring”即可檢視
部落格
Java技術倉庫《Java程式設計師複習指南》
https://github.com/h2pl/Java-Tutorial
整合全網優質Java學習內容,幫助你從基礎到進階系統化複習Java
面試指南
全網最熱的Java面試指南,共200多頁,非常實用,不管是用於複習還是準備面試都是不錯的。
在公眾號【Java技術江湖】回覆“PDF”即可免費領取。
寫在最後
如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉發朋友圈就是對我最大的支援啦,你們的支援是對我最大的鼓勵。
對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2682583/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 五分鐘學Java:一篇文章帶你搞懂spring全家桶套餐JavaSpring
- 一篇文章讓你搞懂原型和原型鏈原型
- 一篇文章搞懂filebeat(ELK)
- 一篇文章搞懂 Android 元件化Android元件化
- 一篇文章搞懂 Activity 啟動模式模式
- 快速上手Ajax【一篇文章就搞懂】
- Java多執行緒詳解——一篇文章搞懂Java多執行緒Java執行緒
- 一篇文章搞定SpringMVC引數繫結SpringMVC
- 一篇文章快速搞懂什麼是GitHubGithub
- 一篇文章快速搞懂 Apache SkyWalking 的 OALApache
- 五分鐘搞懂spring-cloud-squareSpringCloud
- Spring:一篇文章總結 Spring MVCSpringMVC
- 一篇文章搞懂JavaScript正規表示式之方法JavaScript
- 一篇文章搞懂Android 自定義viewgroup的難點AndroidView
- 一篇文章搞懂android儲存目錄結構Android
- 一篇文章快速搞懂Qt檔案讀寫操作QT
- 一篇文章帶你徹底搞懂join的用法
- 一篇文章帶你搞懂 etcd 3.5 的核心特性
- 一篇文章搞懂熱修復類載入方案原理
- spring和springmvc的區別SpringMVC
- InfluxDB從原理到實戰 - 一篇文章搞懂InfluxDB時區UX
- 什麼。你還沒有搞懂Spring事務增強器 ,一篇文章讓你徹底搞懂Spring事務,雖然很長但是乾貨滿滿Spring
- 一篇文章學會 DockerDocker
- 一篇文章學會Vim
- 一篇文章學會GitGit
- 本週精心挑選9篇Java和Spring文章JavaSpring
- 一篇文章概括Spring Cloud微服務教程SpringCloud微服務
- 8分鐘搞懂Java中的各種鎖Java
- 3分鐘快速搞懂Java的橋接方法Java橋接
- 一篇文章看懂Java併發和執行緒安全(二)Java執行緒
- 一篇文章看懂Java併發和執行緒安全(一)Java執行緒
- 一篇文章學會Docker命令Docker
- 這一次搞懂SpringMVC原理SpringMVC
- 搞懂 Java equals 和 hashCode 方法Java
- 五分鐘搞懂HTTPSHTTP
- 一篇文章弄懂cookie、session和tokenCookieSession
- 五分鐘學後端技術:一篇文章教你讀懂大資料技術棧!後端大資料
- spring和springmvc是單例還是多例SpringMVC單例