亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                7天學(xué)完Spring:Spring框架搭建和解析以及Bean對象的創(chuàng)建

                7天學(xué)完Spring:Spring框架搭建和解析以及Bean對象的創(chuàng)建

                目錄

                • 二丶Spring核心和設(shè)計思想
                • Spring是什么?如何理解SpringIoC和DI是什么?區(qū)別?
                • 通過容器對象.getBean()獲取依賴注入:把一個Bean對象,注入到另一個Bean的屬性當中byName:通過Bean的id/名稱來匹配如果此時你的id/名稱不存在或者說不唯一。怎么綁定?方式一:使用 @Qualifier(“XXX”)方式二: 使用@Resource(name=”XXX”)說一下@Autowired 和 @Resource 的區(qū)別

                這一部分就是關(guān)于Spring的部分了,在這里我們主要學(xué)習(xí)四個部分

                1、Spring2、Spring Boot3、Spring NVC4、MyBatis

                這里特別對最后一個說一下,MyBatus。它是用來 代替 JDBC 編程,JDBC 作為Java 提供的一組 用來 操作數(shù)據(jù)庫 的 API非常繁瑣

                1、獲取數(shù)據(jù)源2、與數(shù)據(jù)建立連接3、編寫 SQL 語句。4、執(zhí)行SQL5、此時 SQL 已經(jīng)執(zhí)行完畢,然后需要我們?nèi)メ尫刨Y源

                所以重復(fù)的代碼就很多,所以不推薦使用。這里我們一步一步來

                一丶為什么學(xué)框架

              1. 學(xué)習(xí)框架相當于從“小作坊”到“工廠”的升級,小作坊什么都要自己做,工廠是組件式裝配,特點就是高效。
              2. 框架更加易用、簡單且高效
              3. 框架的便捷性

                什么意思呢?

                1、 需配置 Tomcat,點擊“運 ”按鈕就可以運 項 ,Spring Boot 內(nèi)置了 Web 容器(可直接運 )。2、 快速添加外部 jar 包(依賴)。3、 快速發(fā)布項 (使 java -jar 式就可以發(fā)布)。4、 對象 動裝配。5、 …

                和servlet進行對比

                我們傳統(tǒng)的servlet怎么使用的呢?

                1、創(chuàng)建一個 maven 項目2、在 pom.xml 中 引入相關(guān)依賴3、創(chuàng)建特定的目錄4、編寫代碼5、打包6、部署7、驗證程序8、發(fā)布【使用 (Tomcat) 進行 程序的部署和發(fā)布】

                光是這一連串的流程下來,就讓人絕望,我們可以清楚的發(fā)現(xiàn)servlet有以下不足

                1、添加外部 jar 不 便,容易出錯, 如添加了 個不匹配的外部 jar 版本;

                2、運 和調(diào)試的時候需要配置 tomcat 不 便;

                3、 發(fā)布不 便,servlet 項 必須依靠外置的 tomcat(外置的 web 容器)運 。

                4、 路由配置不 便, 個訪問地址對應(yīng) 個 Servlet 類。

                5、…

                而以上痛點問題,都可以通過 JavaEE 進階框架解決,接下來我們一起來看。

                二丶Spring核心和設(shè)計思想

                Spring是什么?如何理解Spring

                先從第一個問題開始,啥是Spring?

                Spring 指的是 Spring Framework(Spring 框架),它是 個開源框架,有著活躍 龐 的社區(qū),這就是它之所以能 久不衰的原因。Spring 持 泛的應(yīng) 場景,它可以讓 Java 企業(yè)級的應(yīng) 程序開發(fā)起來更簡單。

                所以總結(jié)一下: Spring就是包含了眾多工具方法的loC容器

                這里可能就有鐵子會發(fā)問啥是容器?

                容器是用容納某種物品的(基本)裝置。

                是不是有點迷,那就想想我們的數(shù)據(jù)結(jié)構(gòu),List,Map。如果還是想不出來,那就再想想我們的Tomcat

                List/Map -> 數(shù)據(jù)存儲容器

                Tomcat -> Web 容器

                這里是不是好奇為啥Tomcat是一個容器呢?

                但是 Tomcat 為什么是一個 Web 容器呢?

                思考一下:

                Tomcat 是用來運行 外部的項目,因此它是一個 Web 容器。

                你有一個項目,想要運行。

                肯定是要將項目部署到 Tomcat 的 webapps 目錄底下,才可以運行。

                此時,webapps 就是一個項目的容器

                而 webapps 目錄,就是 Tomcat 下面的一個子目錄。

                那么,我們將 Tomcat 稱為是一個容器,沒有任何問題

                IoC和DI是什么?區(qū)別?

                IoC = Inversion of Control 翻譯成中文是“控制反轉(zhuǎn)”的意思,也就是說 Spring 是一個“控制反轉(zhuǎn)”的容器,怎么理解這句話呢?

                分成兩點,第一個點是控制,第二個點是反轉(zhuǎn)。

                也就是說:之前程序的控制權(quán)限是在我們自己手上,現(xiàn)在,我們把這個控制權(quán)交出去了。

                那么通過一個實際的情況來說一下

                我們在 A 類 中,想去調(diào)用 B 類中的方法,是怎么做的?

                是不是 要去new B 類對象,通過 對象 去調(diào)用 B類中的方法。當前 B 的控制權(quán),是我們手上的。而 控制反轉(zhuǎn),就是將我們手上的權(quán)限,交由 “其他人” 來操作這個類。這個“其他人”,就是 Spring 框架。

                此時,我們想要 A 類中調(diào)用 B 的時候, 告訴 框架,我要在 A 中 調(diào)用 B 了。

                至于 B 的生命周期,和我們沒有任何關(guān)系。

                這是控制反轉(zhuǎn)。

                前面也說了:spring是一個控制反轉(zhuǎn)容器

                也就是 像之前在傳統(tǒng)開發(fā)的時候,所有需要我們自己去new東西,都不需要我們再去new 了。因為我們把控制權(quán) “反轉(zhuǎn)給了” Spring 框架。Spring 會幫我們管理所有的對象(Bean)。

                哪一個例子來舉例吧

                比如說我們構(gòu)造一個car類,然后我們肯定是要new一個car對象,在car對象進行初始化的時候是不是要new一個Framework對象?那么繼續(xù)往下走,每一次的初始化都帶著底層的對象的new,那么問題就來了,這對應(yīng)著什么呢?

                如果輪胎的尺寸的固定的,然而隨著對的車的需求量越來越大,個性化需求也會越來越多,這時候我們就需要加工多種尺寸的輪胎,那這個時候就要對上面的程序進行修改了。這一修改,就是全部的修改呀!

                那么我們怎么解決呢?

                我們可以嘗試不在每個類中自己創(chuàng)建下級類,如果自己創(chuàng)建下級類就會出現(xiàn)當下級類發(fā)生改變操作,自己也要跟著修改。

                此時,我們只需要將原來由自己創(chuàng)建的下級類,改為傳遞的方式(也就是注入的方式),因為我們不需要在當前類中創(chuàng)建下級類了,所以下級類即使發(fā)生變化(創(chuàng)建或減少參數(shù)),當前類本身也無需修改任

                何代碼,這樣就完成了程序的解耦。

                是不是有點繞?沒關(guān)系,這樣想,原來我們是從下往上,一層包含一層,上面包含這下一層的New的對象,然后我們可以不這樣搞,我們可以從下往上走

                也就是說,我們先創(chuàng)建好下層,然后把下層的屬性注入到上層,一層一層往上遞歸包含,最后到最頂上。

                在傳統(tǒng)的代碼中對象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire改進之后解耦的代碼的對象創(chuàng)建順序是:Tire -> Bottom -> Framework -> Car

                通用程序的實現(xiàn)代碼,類的創(chuàng)建順序是反的,傳統(tǒng)代碼是 Car 控制并創(chuàng)建了

                Framework,F(xiàn)ramework 創(chuàng)建并創(chuàng)建了 Bottom,依次往下,而用了容器之后是上級對象創(chuàng)建并控制下級對象了,而是下級對象把注入將當前對象中,下級的控制權(quán)不再由上級類控制了,這樣即使下級類發(fā)生任何改變,當前類都是不受影響的,這就是典型的控制反轉(zhuǎn),也就是 IoC 的實現(xiàn)思想

                那么回到開頭,什么是loC?什么是DI?

                1>理解loC

                我們可以直接認為 Spring 就是一個 IoC 容器。

                既然它是一個容器,那么,容器主要的兩個核心功能,肯定是具有的

                1、裝東西: 那些被 控制反轉(zhuǎn) 的對象(Bean),都可以存儲在 Spring 中。 2、取東西: 作為一個容器,不可能只存不取吧? 將 對象(Bean),從 Spring 中 取出來。

                這也是 Spring IoC 容器 最核心的兩個功能【存 和 取 】。

                那根據(jù)上面我的例子,為啥說能簡化開發(fā)呢?

                將對象存放到容器中的好處:將對象存儲在 IoC 容器相當于將以后可能用的所有工具制作好都放到倉庫中,需要的時候直接取就行了,用完再把它放回到倉庫。而 new 對象的方式相當于,每次需要工具了,才現(xiàn)做,用完就扔掉了也不會保存,下次再用的時候還得重新做,這就是 IoC 容器和普通程序開發(fā)的區(qū)別。

                2>理解DI

                說到 IoC 不得不提的一個詞就是“DI”,DI 是 Dependency Injection 的縮寫,翻譯成中文是“依賴注入”的意思。

                所謂依賴注入,就是由 IoC 容器在運行期間,動態(tài)地將某種依賴關(guān)系注入到對象之中。所以,依賴注入(DI)和控制反轉(zhuǎn)(IoC)是從不同的角度的描述的同一件事情,就是指通過引入 IoC 容器,利用依賴關(guān)系注入的方式,實現(xiàn)對象之間的解耦。

                說一說DI和loC的區(qū)別

                兩者其實是一個東西,但是是對一個事物從不同角度進行了闡述。loC就是把某個對象交給Spring,然后用的時候跟他要,Spring怎么把對象給我我我不關(guān)心,我只要能拿到就可以了。而DI就是一個具體的實現(xiàn),DI關(guān)于于怎么將依賴注入對應(yīng)的對象里面。

                哪一個例子來說

                還是這個車,我們從兩個角度來說一下

                處理思維(loC):一個類外部依賴的對象,其控制權(quán)限發(fā)生了反轉(zhuǎn),我們就不再去new它了,而是直接用。然后直接從Spring哪里拿,告訴他,我要用實際操作(DI):這里我們從底向上就不是new了,而是Spring中,把我的下一級拿過來,直接注入。

                所以DI是實際實現(xiàn),但是loC是思想。

                1>Spring 是什么?如何理解 Spring?

                Spring 是一個包含 眾多工具方法 的 IoC 容器。既然 Spring 是一個 IoC 容器(反轉(zhuǎn)控制容器)。Spring是 存儲 IoC【反轉(zhuǎn)控制(后的對象)】 的一個容器

                2>IoC 和 DI 是什么?有什么區(qū)別?

                IoC – Inversion Of Control(控制反轉(zhuǎn))主要是將 對象的權(quán)限(創(chuàng)建與銷毀)交由 Spring 來管理。程序員 不必再去 new 對象了!在使用到某個對象的時候,直接向 Spring 索取,直接使用即可。DI dependency injection(依賴注入)將 引入的依賴 (執(zhí)行所依賴的對象),拿過來使用。區(qū)別:IoC 是一種 思想。DI 是具體的實現(xiàn)。

                Spring核心功能?

                這里上面也說了,這里最后再提一下

                既然 Spring 是一個容器,那么,肯定是具有容器的兩個核心功能(存 和 取)。1、將 Bean(反轉(zhuǎn)的對象)存儲到 Spring 容器中。2、將 Bean(反轉(zhuǎn)的對象)從 Spring 容器中取出來。這也就是 Spring 的 兩個核心功能。

                三丶Spring創(chuàng)建和使用

                準備環(huán)境

                首先就是創(chuàng)建一個maven項目

                然后之后直接創(chuàng)建就好

                這里沒有太多可以說的,主要就是要記得添加一下spring的依賴

                org.springframework spring-context 5.2.3.RELEASE org.springframework spring-beans 5.2.3.RELEASE

                創(chuàng)建核心容器–注解配置方式

                這里我們創(chuàng)建容器有多種方式,比如說

                ApplicationContext context = new ClassPathXmlApplicationContext(“spring-config.xml”);

                但是這里種方式用的很少,這里我也不在對他介紹過多,這里我介紹另外一種

                AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(“org.example.lifecycle”);

                首先說一下這種方式

                具體的格式為

                Application context = new 接口實現(xiàn)類()

                這里我們就會有很多很多的接口,但是這里我們就只介紹兩種

                如果說你是加載類加載路徑下的xml容器,然后再把內(nèi)容裝到容器當中,那么過程無疑就很麻煩,這里我們不推薦使用這種方式。我們推薦用配置的方式去創(chuàng)建容器

                1>包掃描

                可以看到,我上面的圖中,通過注解配置的方式去創(chuàng)建容器的時候,加了個包的路徑,什么意思呢?

                但是這里有問題呀!我不可能這個類中所有的東西都是要使用的,那我怎么辦呢?

                2>添加類注解–五類注解解析

                這里的話就要加注解,告訴容器,那個類是我需要的,那個是我不需要的

                1. 類注解:@Controller、@Service、@Repository、@Component、@Configuration。2. 方法注解:@Bean。

                這里的話一一說明一下:

                @Controller:表示的是業(yè)務(wù)邏輯層;用于web開發(fā)處理http請求和響應(yīng),類似servlet@Servie:服務(wù)層;做業(yè)務(wù)邏輯的@Repository:持久層;數(shù)據(jù)庫訪問,一般是數(shù)據(jù)庫操作@Component:一般組件@Configuration:配置層。系統(tǒng)啟動前提前加載一些資源

                然后這里我們進行寫個代碼驗證一下

                那么誰可以被掃描注冊到容器中呢?答案毋庸置疑,肯定就是 UserService

                這里特別說明一下!?。。。。。。。。。。。。。。。。。。。。。?!

                你類注解這里的ID是有講究的:

                就是說:

                Bean ID/名稱,默認是類名首字母小寫

                那么我接就接著往下說,你類當中所有的東西都是需要的嘛?那肯定不一定呀,對不對?那么我們怎么辦呢?這個時候就要用到我們的方法注解了

                3>添加方法注解

                這里我們就直接上代碼圖

                所以你甚至還可以再過分一點:在當前方法注解的同時放開類注解,讓類一邊被掃描的時候方法也在被掃描(玩的挺花哈)

                所以其實你可以發(fā)現(xiàn), Spring 存放的東西,其實是一個類似于 Map 的這樣子的結(jié)構(gòu),這里的鍵就是我們的 BeanID ,值呢就是我們的 Bean對象

                總結(jié)

                這里小小的總結(jié)一下

                說一下ApplicationContexte和BeanFactory的區(qū)別

                四丶Bean對象的使用

                通過容器對象.getBean()獲取

                這里就是我們上面的使用方式

                所以這里不做過多闡述,主要是下面的這種,是我們主要的學(xué)習(xí)目標

                依賴注入:把一個Bean對象,注入到另一個Bean的屬性當中

                獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,有時候也叫對象注入。

                對象裝配(對象注入)的實現(xiàn)方法以下 3 種:

              4. 屬性注入
              5. 構(gòu)造方法注入
              6. Setter 注入
              7. 接下來,我們分別來看具體的實現(xiàn)

                byType類型匹配

                屬性注入是使用 @Autowired 實現(xiàn)的,將 Service 類注入到 Controller 類中。

                這種的就是屬性/setter方法上加 @Autowired ,這里我們直接來代碼演示

                繼續(xù)往下走,如果說你再多來幾個呢?就是我再來一個 屬性:二號張三 還能往出拿嘛?當然可以拿,這根本不沖突,不是嘛?

                那么問題就來了,既然字符對象我可以往出拿,那么其他類的對象我是不是也可以存著,然后需要的時候往出拿呢?

                那就試一試唄?

                byName:通過Bean的id/名稱來匹配

                但是你仔細看一看,有沒有發(fā)現(xiàn)這個打印出來的有點眼熟?沒錯,他就是我們第一個創(chuàng)建的UserService對象

                所以這啥意思?你是通過變量名稱去獲取打印對象的???

                不知道,也不好說,所以我們試一試好嘛?

                這里如果說對我這個us1有疑問的,那么可以看我上面 [三丶Spring創(chuàng)建和使用 == >創(chuàng)建核心容器–注解配置方式 ==> 3>添加方法注解]這里。往下走:

                然后我們之后打印一下

                所以就是的了?那么規(guī)則是什么呢?如果說我此時來一個us3呢?我這個時候是沒有new us3呢呀?

                然后此時解決一下我們上面的問題,這里你怎么搞?那么觸發(fā)一個問題

                如果此時你的id/名稱不存在或者說不唯一。怎么綁定?

                這里先梳理一下,先是檢查類型,發(fā)現(xiàn)好幾個相同類型,然后就去檢查id,然后你此時id不唯一或者id不存在怎么辦?那就要會報錯!??!

                方式一:使用 @Qualifier(“XXX”)

                直接加注解,里面指定唯一的對象

                方式二: 使用@Resource(name=“XXX”)

                說一下@Autowired 和 @Resource 的區(qū)別

                1.出身不同:@Autowired 來自于 Spring,而 @Resource 來自于 JDK 的注解;2.使用時設(shè)置的參數(shù)不同:相比于 @Autowired 來說,@Resource 支持更多的參數(shù)設(shè)置,例如name 設(shè)置,根據(jù)名稱獲取 Bean,@Autowired 只有一個 value 屬性3.用法不同@Autowired 支持 屬性注入,構(gòu)造方法注入,Setter 注入@Resource 支持 屬性注入,Setter 注入

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年7月24日 17:05
                下一篇 2022年7月24日 17:05

                相關(guān)推薦

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時間:周一至周五,10:30-18:30,節(jié)假日休息