-
1 # 極客宇文氏
-
2 # 這樣學程式設計不枯燥
在學習spring框架之前,先夯實Java基礎,基礎夯實之後,後面的學習會更加的得心應手,比如說,Java基礎,web前端,資料庫,Javaweb程式設計等,這些掌握的差不多了,再去研究spring。
以前學習Java是在“如鵬網”上學習的,有比較全面的課程體系,可以作為參考;詳細的可以到"如鵬網"上去了解一下,有網路的地方就可以學習,有問題隨時提問,老師實時線上答疑。每個章節的後面都有相應的練習題和麵試口才題,需要以錄音的方式進行提交,實時把控學習質量。有新的課程更新了,也是可以繼續申請了來學習的,比如說,Java提高課程,裡面對spring和設計模式有更加深入詳細的講解。
第二階段:NoSQL第三階段:設計模式第四部分:分散式技術第五部分:綜合專案。這是一個手機商城系統,綜合應用VueJS、Spring Boot、Spring Cloud、NoSQL、MQ、全文檢索、ELK、sharding jdbc等技術。 -
3 # Java實戰技術
謝邀! 雖然Spring中用到了很多設計模式,但是如果你沒學過設計模式,也是可以先學習Spring的,看過設計模式會對理解Spring的原始碼有幫助。 學一個框架,首先你要先學會如何使用,這樣後續才可以更好的理解它的內部原理,理解原理才能在它的基礎上做擴充套件,使用過程中報錯也可以快速定位解決問題,先學會爬,才能學會走。 Spring框架的使用,可以參照官方的使用手冊,讀第一手資料不會被誤導,如果你覺得英文看起來比較吃力,可以在豆瓣上找一本比較靠譜的書,跟著書學習,推薦一本Spring實戰。Spring框架的基礎用法會了,可以結合其它框架,比如mybatis等,整合使用,動手實踐寫一些小的專案。 在熟練使用的基礎上,要去研究Spring內部的實現原理,如IOC、AOP、宣告式事務等底層是如何實現的,有哪些擴充套件點、擴充套件介面可以使用,讀原始碼去研究實現原理,配合書籍會效率高些,同樣去找一本點評高的書。 再說設計模式,設計模式是解決設計問題的法寶,它是經驗積累的成果,學習設計模式先了解它能解決什麼問題、如何實現的,做到心裡有數,但是切勿為了用某個設計模式而用,當真正需要解決某類問題的時候可以選擇使用! 希望對你有所幫助!
-
4 # 程式汪汪
Spring在java生態圈的地位非常高
我先回答如何學習spring,設計模式先不談。
多實戰【學習最佳途徑】會用spring不難,多在spring專案裡開發功能即可。
眾所周知,Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反轉”;AOP(Aspect-OrientedProgramming),即“面向切面程式設計”.
我以個人體驗講講吧,我剛開始學spring時,就是死記硬背這些概念,然後在SSM框架裡開發功能需求,看看別人在spring怎麼依賴、怎麼定義Bean、怎麼配置spring事務,依葫蘆畫瓢就把功能搞定了,但由於沒有深入理解Spring的IOC和AOP,在出現spring問題時排查解決速度非常慢。
要提升【高階、資深、專家開發】說白了,要漲更高的工資,spring的理解必須要深。常見spring介面必須知道作用。
如下:
學好這些spring高階特性,你就可以利用spring定製個性化功能,對於業務環境非常複雜的專案spring可以幫我們解決很多複雜問題。如:多資料來源的多事務問題,可以利用spring的FactoryBean去生成代理物件;有些特殊業務場景需要手動獲取spring裡的Bean物件等等。
第二個問題是先學習設計模式還是spring?
沒有固定先後順序spring裡包含了很多設計模式的應用,設計模式這個問題可以單獨拿出來細講。
總結面試必備,面試官非常喜歡問spring知識點透過實際專案來學習理解spring,可以試著一個debug斷點跟下spring原始碼spring是Java程式設計師可以用一生時間來研究的,水很深 -
5 # java和小熊
。 如果你是想學習spring,建議你可以在網上找一些spring的基礎課程,系統學習下。如
spring容器、依賴注入、控制反轉、aop、bean的生命週期等等
。如果你是想學設計模式,也可以在網上找到對應的系統課程
。 spring與設計模式是兩個概念,沒有一定要先學誰。 spring原始碼中,使用了許多優秀的設計模式,如工廠、單例、代理、觀察者等。但是沒有學過設計模式,你也可以看的懂。設計模式,只是一種經驗,一種問題的最優解決方案,而不是一種新的技術點。
-
6 # 五四瘋哥
首先設計模式和Spring你可以當成是兩門學科,並沒有一個必須的前後關係,雖然sping中用到了不少設計模式,但不懂的話至少對學習spring的使用是沒有太大影響的。所以想學的話可以直接學spring。
學任何一門技術,都是由簡入難,先學會最基本的怎麼用,然後有時間有精力可以再去學習其中的原理。就像我們最開始學習用電腦,都是先學怎麼開關機,怎麼上網,怎麼打字,不會上來先學cpu是怎麼執行的。具體到Spring的學習也是這樣,上來先不要去摳原理,先學會怎麼用,建議到網上找些影片教程,跟著教程可能只需要幾天時間就可以入門了,無非依賴注入和切面程式設計這些東西。spring看完了,可以看下SpringMVC的教程,再之後Springboot。框架這個東西,本來就是開發出來簡化程式設計師的工作的,所以你會發現越往後學用起來越簡單,對自己學習的信心是一個很好的鼓勵。等你會用了,感興趣再去研究其中的原理,你會時不時的覺得”噢,原理是這麼回事“。
強烈建議不要一上來就去看書,有些東西用話說出來可能一聽就懂,但用文字描述就可能要費事了,沒有一定的基礎去看書往往會越來越迷糊,而且書裡會大篇幅的講原理,很容易把初學者陷進去。
-
7 # 小書童neyo
掌握applicationcontext介面,beanpostprocessor。總之就是ioc容器和aop,尤其是aop。拓展瞭解aspectj。spring的所有生態成員都是基於ioc和aop的。前期需要掌握宣告式事務,瞭解動態代理模式,大致aop的實現原理,各種advice。其次sping mvc是需要掌握的,主要放在dispatcherservlet介面。再然後需要了解一下觀察者模式,釋出訂閱模式,向spring提供的事件驅動程式設計過渡。後面可以多瞭解spring session,cache,security,spring boot ,最後再向微服務過渡。當然其中可能還涉及定時任務啥的,工作中肯定會用到。總結一句話 萬物皆可aop ,重中之重!
-
8 # 飛馳的泡泡
現在你在網上隨便搜搜,都會搜到成百上千條的答案。總結最重要的一點,多用,多想,多總結。
眾所周知,spring的生態圈在java開發中的地位那可是舉足輕重的。現在web開發不是SSM就是SpringBoot全家桶,想要學好Spring,就要知道Spring在我們的開發工作中做了什麼,通俗點來講,就是我們在開發中應用Spring有什麼好處。
Spring的特性,我們都知道Ioc和AOP嗎。
IOC控制反轉,說的直白點就是,之前該你做的事,現在不倫你做了。
舉個不太恰當的例子:現在你開個飯店,做什麼菜,做菜需要什麼材料,都是你自己說了算,但是現在生意不太好做呀,你要管的事情太多了呀。
隔壁那個加盟店的生意不錯呀,輕鬆還掙錢。所以你想著,我也加盟個飯店吧。但是你加盟之後呢,你就發現,原來你做啥菜,買啥菜,是你自己定的選單,現在是人家加盟公司,來給你定做什麼菜 ,來做菜的食材,都是人家直接配送了。你只能使用總部調配送來的東西呀。你不能決定你用啥菜了。
換到我們的Spring的Ioc來說呢,就是之前你這個物件要使用那個物件來幹啥事,你可以自己new一個呀,現在不行了,你這個物件不能隨便用了,得用我Spring指定分配給你的這個物件。你是失去了物件的創造和選擇權利。
再來說Spring的學習,個人覺得不需要非得先學習設計模式,在學習Spring的過程中你會更多,更深入的瞭解到這些。
給你推薦本Spring的書Spring原始碼解析
-
9 # 程式猿W
如果僅僅是想學會使用,則可以不學習設計模式,如果想深入層次的學習Spring底層原始碼,則設計模式是必不可少的!
下面從幾個方面進行介紹
(1) Spring 原始碼中使用了哪些設計模式?
(2) 怎樣學習設計模式?
(3) 推薦設計模式的書籍
Spring原始碼中使用了哪些設計模式?spring 中使用了多種設計模式,下面簡單介紹一下主要的設計模式
(1) 單例模式
保證獨一無二,為了提高資源重複利用,透過技術手段保證在整個系統執行階段,只有一個例項
場景: 配置檔案、監控程式、IOC 容器、日曆
實現手段: 懶漢式、餓漢式、註冊登記式、反序列處理
Spring最常用的,註冊登記式,效率效能最高的
Spring中bean的預設作用域就是singleton(單例)。
實現方式:
xml : <bean scope="singleton"/>註解:@Scope(value = "singleton")Spring 透過 ConcurrentHashMap 實現單例登錄檔的特殊方式實現單例模式。Spring 實現單例的核心程式碼如下
(2) 代理設計模式
代理模式在 AOP 中的應用
AOP(Aspect-Oriented Programming:面向切面程式設計)能夠將那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任(例如事務處理、日誌管理、許可權控制等)封裝起來,便於減少系統的重複程式碼,降低模組間的耦合度,並有利於未來的可拓展性和可維護性。
Spring AOP 就是基於動態代理的,如果要代理的物件,實現了某個介面,那麼Spring AOP會使用JDK Proxy,去建立代理物件,而對於沒有實現介面的物件,就無法使用 JDK Proxy 去進行代理了,這時候Spring AOP會使用Cglib ,這時候Spring AOP會使用 Cglib 生成一個被代理物件的子類來作為代理,如下圖所示:
當然你也可以使用 AspectJ ,Spring AOP 已經集成了AspectJ ,AspectJ 應該算的上是 Java 生態系統中最完整的 AOP 框架了。
使用 AOP 之後我們可以把一些通用功能抽象出來,在需要用到的地方直接使用即可,這樣大大簡化了程式碼量。我們需要增加新功能時也方便,這樣也提高了系統擴充套件性。日誌功能、事務管理等等場景都用到了 AOP 。
Spring AOP 和 AspectJ AOP 有什麼區別?
Spring AOP 屬於執行時增強,而 AspectJ 是編譯時增強。 Spring AOP 基於代理(Proxying),而 AspectJ 基於位元組碼操作(Bytecode Manipulation)。
Spring AOP 已經集成了 AspectJ ,AspectJ 應該算的上是 Java 生態系統中最完整的 AOP 框架了。AspectJ 相比於 Spring AOP 功能更加強大,但是 Spring AOP 相對來說更簡單,
如果我們的切面比較少,那麼兩者效能差異不大。但是,當切面太多的話,最好選擇 AspectJ ,它比Spring AOP 快很多。
(3) 模板方法
應用場景: JdbcTemplate 工作流
程式碼場景: 模擬Spring JdbcTemplate的簡單實現
Spring 中 jdbcTemplate、hibernateTemplate 等於 Template 結尾的對資料庫操作的類,它們就使用到了模板模式。一般情況下,我們都是使用繼承的方式來實現模板模式,但是 Spring 並沒有使用這種方式,而是使用Callback 模式與模板方法模式配合,既達到了程式碼複用的效果,同時增加了靈活性。
(4) 觀察者模式
觀察者模式是一種物件行為型模式。它表示的是一種物件與物件之間具有依賴關係,當一個物件發生改變的時候,這個物件所依賴的物件也會做出反應。Spring 事件驅動模型就是觀察者模式很經典的一個應用。Spring 事件驅動模型非常有用,在很多場景都可以解耦我們的程式碼。比如我們每次新增商品的時候都需要重新更新商品索引,這個時候就可以利用觀察者模式來解決這個問題。
Spring 事件驅動模型中的三種角色
事件角色
ApplicationEvent (org.springframework.context包下)充當事件的角色,這是一個抽象類,它繼承了java.util.EventObject並實現了 java.io.Serializable介面。
Spring 中預設存在以下事件,他們都是對 ApplicationContextEvent 的實現(繼承自ApplicationContextEvent):
ContextStartedEvent:ApplicationContext 啟動後觸發的事件;ContextStoppedEvent:ApplicationContext 停止後觸發的事件;ContextRefreshedEvent:ApplicationContext 初始化或重新整理完成後觸發的事件;ContextClosedEvent:ApplicationContext 關閉後觸發的事件。事件監聽者角色
ApplicationListener 充當了事件監聽者角色,它是一個介面,裡面只定義了一個 onApplicationEvent()方法來處理ApplicationEvent。ApplicationListener介面類原始碼如下,可以看出介面定義看出介面中的事件只要實現了 ApplicationEvent就可以了。所以,在 Spring中我們只要實現 ApplicationListener 介面實現 onApplicationEvent() 方法即可完成監聽事件
事件釋出者角色
ApplicationEventPublisher 充當了事件的釋出者,它也是一個介面。
ApplicationEventPublisher 介面的publishEvent()這個方法在AbstractApplicationContext類中被實現,閱讀這個方法的實現,你會發現實際上事件真正是透過ApplicationEventMulticaster來廣播出去的。具體內容過多,就不在這裡分析了,後面可能會單獨寫一篇文章提到。
Spring 的事件流程總結
定義一個事件: 實現一個繼承自 ApplicationEvent,並且寫相應的建構函式;
定義一個事件監聽者:實現 ApplicationListener 介面,重寫 onApplicationEvent() 方法;
使用事件釋出者釋出訊息: 可以透過 ApplicationEventPublisher 的 publishEvent() 方法釋出訊息。
Example:
(5) 介面卡模式
介面卡模式(Adapter Pattern) 將一個介面轉換成客戶希望的另一個介面,介面卡模式使介面不相容的那些類可以一起工作,其別名為包裝器(Wrapper)。
spring AOP中的介面卡模式
我們知道 Spring AOP 的實現是基於代理模式,但是 Spring AOP 的增強或通知(Advice)使用到了介面卡模式,與之相關的介面是AdvisorAdapter 。Advice 常用的型別有:BeforeAdvice(目標方法呼叫前,前置通知)、AfterAdvice(目標方法呼叫後,後置通知)、AfterReturningAdvice(目標方法執行結束後,return之前)等等。每個型別Advice(通知)都有對應的攔截器:MethodBeforeAdviceInterceptor、AfterReturningAdviceAdapter、AfterReturningAdviceInterceptor。Spring預定義的通知要透過對應的介面卡,適配成 MethodInterceptor介面(方法攔截器)型別的物件(如:MethodBeforeAdviceInterceptor 負責適配 MethodBeforeAdvice)。
程式碼場景:登入,為了相容舊系統的登入功能,在老系統的基礎之上進行相容程式設計,Spring Adapter結尾的
(6) 裝飾器模式
裝飾者模式可以動態地給物件新增一些額外的屬性或行為。相比於使用繼承,裝飾者模式更加靈活。簡單點兒說就是當我們需要修改原有的功能,但我們又不願直接去修改原有的程式碼時,設計一個Decorator套在原有程式碼外面。其實在 JDK 中就有很多地方用到了裝飾者模式,比如 InputStream家族,InputStream 類下有 FileInputStream (讀取檔案)、BufferedInputStream (增加快取,使讀取檔案速度大大提升)等子類都在不修改InputStream 程式碼的情況下擴充套件了它的功能
應用場景: IO流 、資料來源、也用程式碼改造一箇舊系統,在Spring 中Decorator結尾的,Wrapper結尾的都是。
(7) 委派模式
代理模式的特殊情況,全權代理
應用場景: 專案經理、Dispatcher
程式碼場景: Spring 中ServletDispatcher /Delegate 命名結尾的都是委派模式
怎樣學習設計模式(1) 調整好心態,不要指望一蹴而就,不可浮躁。
學習和掌握設計模式需要一個過程,不同的階段看這些設計模式有不同的領悟和感受。不要指望真正的設計模式的書籍既簡單又有趣,一看就懂的。
(2) 學習設計模式的第一步 : 準確理解每個設計模式的功能、基本結構、標準實現,瞭解適合使用它的場景以及使用的效果。
(3) 學習設計模式的第二步: 實際的開發中,嘗試著使用這些設計模式,並反覆思考和總結是否使用得當,是否需要做一些變化。
(4) 學習設計模式的第三步 : 再回頭去看設計模式的理論,有了實際的模式應用經驗再看設計模式,會有不同的感悟,一邊看一邊結合著應用經驗來思考。比如設計模式的本質功能是什麼?它是如何實現的?z這種實現方式還可以在什麼地方應用? 如何才能把這個設計模式和具體的應用結合起來?這個設計模式的出發點是什麼?等等。可以有很多考慮的點,從不同的角度對設計模式進行思考。
(5) 第四步 : 多次反覆學習設計模式的第二步和第三步。也就是在實際開發中使用,然後結合理論思考,然後再應用,再思考...如此迴圈,反覆多次,直到達到對設計模式基本掌握的水平。
簡而言之,要注意使用設計模式的理論和實踐相結合,理論指導實踐,實踐反過來加深對理論的理解,如此反覆迴圈,成螺旋式上升!
設計模式書籍的推薦這本書非常經典,大家可以反覆閱讀,由於網上已沒有紙質書,只有電子版,
回覆列表
看見上一位答主的可愛回答想笑。題主問這個問題應該是還沒接觸瞭解過spring框架,我有下面的學習建議:
spring框架和設計模式是兩大學習點spring框架包含了許多架構的頂級設計思路,去研究它是需要花費比較多經歷的。而設計模式也是一大課題 ,有專門一本厚厚的設計模式的書籍給你學習。因此,這兩種東西不能說先去學誰,應該是用到哪個學哪個。
有人說設計模式是為了彌補Java的不足,這是有一定道理的,常規的二十三種設計模式如果說你要全部理清還算要一點時間,要說能學精通還真的挺難。
spring框架的學習建議:先學習搭ssm框架專案感受spring框架的魅力。對spring框架原理進行理解,這裡如果牽扯上了什麼設計模式就去學習對應的設計模式。看看能不能理解和基本運用依賴注入和麵向切面程式設計了。推薦讀《spring原始碼深度解析》,系統性得結合原始碼學習spring框架,途中一定會遇到的設計模式,遇到哪種模式就學哪種模式。歸納一下就是兩種並行學習,設計模式是輔助spring框架的理解。