五分鐘學Java:一篇文章帶你搞懂spring全家桶套餐

来源:https://www.cnblogs.com/xll1025/archive/2020/03/26/12577975.html
-Advertisement-
Play Games

原創聲明 本文首發於微信公眾號【程式員黃小斜】 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 本文思維導圖 什麼是Spring,為什麼你要學習spring? 你第一次接觸spring框架是在什麼時候?相信很多人和我一樣,第一次瞭解spring都不是做項目的時候用到,而是在網上看到或者是聽到 ...


副本_未命名.jpg

原創聲明

本文首發於微信公眾號【程式員黃小斜】

本文作者:黃小斜

轉載請務必在文章開頭註明出處和作者。

本文思維導圖

什麼是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恰好解決了這兩個問題。

image

其實,spring生態中的內容豐富多彩,除了上圖提到的這些模塊,如今spring已經發展到了springboot和springcloud,為微服務等後端技術棧提供非常優質的解決方案。

如今,spring框架已經成為Java程式員必知必會的內容了,那麼如何開始學習spring框架,就成為了我們今天要討論的主題。

首先,先來看看spring基礎部分應該如何學習。

spring基礎

image

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(一般老項目使用)等。

image

作為一個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”即可免費領取。

寫在最後

如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉發朋友圈就是對我最大的支持啦,你們的支持是對我最大的鼓勵。

對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字元集 通用字元名 以 \u 或 \U 打頭 \u 後4 個十六進位位,\U 後8 個十六進位位。 這些位表示的是字元的 ISO 10646 碼點。 在源代碼中,可使用適用於所有系統的通用編碼名,而編譯器將根據當前系統使用合適的內部編碼來表示它。 寬字元(wchar_t) 整數類型。 可以表示系統使 ...
  • 初始化 變數: c:int cwls = 10; c++: int wrens(432); c++11: int emus{7}; int rheas={12}; 括弧中不包含任何東西,變數初始化為 0 ; 適用於任何類型,等號可有可無; 結構體: C: inflatable guest= { "G ...
  • 枚舉 enum:創建符號常量的方式 enum spectrum { red, orange, yellow, green, blue, violet, indigo, ultraviolet }; spectrum 被稱為枚舉,red 等作為符號常量,這些符號常量叫做枚舉量。 預設將整數值賦給枚舉量 ...
  • 字元串輸入 面向單詞 cin : 使用空白(空格、製表符和換行符)來確定字元串的結束位置。 自動添加空字元。 面向行 getline(m,n) m 存儲輸入行的數組名稱,n 為讀取字元數。 最多讀取 n-1 個字元,自動添加空字元。 換行符確定輸入結尾,停止讀取。 不保存換行符,用空字元代替換行符。 ...
  • 在前一篇文章中,我們已經介紹了 Spring IOC 的相關知識,今天將為個位介紹 Spring 中 Bean 的相關知識。關註我的公眾號「Java面典」,每天 10:24 和你一起瞭解更多 Java 相關知識點。 Bean 的生命周期 Spring 生命周期有四個階段,分別是: 1. 實例化 In ...
  • 什麼是SSRF 一個對外的Web介面,改介面能讓用戶控制curl命令,去訪問別的web服務。 簡圖如下 想象一下當用戶請求的 改成 ,是不是覺得原本不可能訪問到內網的主機,現在就很容易就能做到了。 原理 PHP代碼演示: 1.查看代碼的時候檢查是否使用curl_setopt( )函數; 2.在看傳入 ...
  • title: 博客歸納 blog: "CSDN" data: "Java學習路線及視頻" 2019 12/31 "時間管理" 2020 1/22 "Git是什麼?" 1/23 "Git安裝 Windows" 3/24 "3000字編程入門 附帶Java學習路線及視頻" 3/25 "淺談Java語言環 ...
  • @ + function表示忽略警告。 eval() 是可以執行php代碼 system() 是可以執行系統命令 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...