本文首發於微信公衆號【程序員黃小斜】html
本文做者:黃小斜java
轉載請務必在文章開頭註明出處和做者。git
你第一次接觸spring框架是在何時?相信不少人和我同樣,第一次瞭解spring都不是作項目的時候用到,而是在網上看到或者是聽到過一個叫作spring的框架,這個框架號稱完爆以前的structs和structs2,吸引了很多人的注意。程序員
那麼,spring到底有沒有神奇呢,據記載,spring框架出現的時間是在2002年,當時的人們對於繁瑣笨重的EJB框架詬病不已,並且對於structs這類框架也沒有什麼好感,這個時候spring從天而,救一大批Java開發者於水火之中。github
讓咱們先看看百度百科對於spring的定義,Spring框架是因爲軟件開發的複雜性而建立的。Spring使用的是基本的JavaBean來完成之前只可能由EJB完成的事情。然而,Spring的用途不只僅限於服務器端的開發。從簡單性、可測試性和鬆耦合性角度而言,絕大部分Java應用均可以從Spring中受益。web
◆目的:解決企業應用開發的複雜性面試
◆功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能spring
◆範圍:任何Java應用數據庫
Spring是一個輕量級控制反轉(IoC)和麪向切面(AOP)的容器框架。json
spring框架解決了程序員在Java開發中長期存在的兩個痛點,那就是bean管理和統一切面,而spring的IOC和AOP剛好解決了這兩個問題。
其實,spring生態中的內容豐富多彩,除了上圖提到的這些模塊,現在spring已經發展到了springboot和springcloud,爲微服務等後端技術棧提供很是優質的解決方案。
現在,spring框架已經成爲Java程序員必知必會的內容了,那麼如何開始學習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框架中,很是便於咱們的使用。
講完了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」便可免費領取。
若是以爲本文對你有幫助的話,請你也不要吝嗇你的「好看」哈,轉發朋友圈就是對我最大的支持啦,大家的支持是對我最大的鼓勵。
對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。