SpringBoot-探索回顧Spring框架本質

自始至終,SpringBoot框架都是為了能夠幫助使用Spring框架的開發 快速高效地構建 一個個基于Spring框架以及Spring生態體系的應用解決方案。要深刻理解SpringBoot框架,首先我們需要深刻理解Spring框架。

一、Spring 中的 IoC、DI 和 DL

部分Java開發者對 IoC 和 DI 的概念有些混淆,認為二者是對等的,實際IoC(Inversion Of Control——控制反轉)有兩種方式:

  • 一種就是DI(Dependency Injection——依賴注入)是當前軟件實體被動接受其依賴的其他組件被IoC容器注入;
  • 而另一種是DL(Dependency Lookup——依賴査找)是當前軟件實體主動去某個服務注冊地査找其依賴的那些服務。

概念之間的關系如圖所示

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MRnrEDuD-1614673450451)(…/…/Study notes/SpringBoot/notes/image/圖2-1 IOC相關概念示意圖.png)]

以一下Spring IoC容器的一個典型代碼片段為例

public class App (public static void main(String[] args) (Applicationcontext context = new FileSystemXmlApplication-Context("...");// ...MockService service = context.getBean(MockService.class); service.doSomething())
)

任何一個使用Spring框架構建的獨立的Java應用,通常都會存在一行類似于context.getBean(..);的代碼,實際上,這行代碼做的就是DL的工作,而構建的任何一種IoC容器背后(比如 BeanFactory或者ApplicationContext)發生的事情,則更多是DI的過程(也可能有部分DL的邏輯用于對接遺留系統)。

此外,Spring IoC容器的依賴注入工作可以分為兩個階段:

階段一:收集和注冊

第一個階段可以認為是構建和收集bean定義的階段,在這個階段中,我 們可以通過XML或者Java代碼的方式定義一些bean,然后通過手動組裝或者讓容器基于某些機制自動掃描的形式,將這些bean定義收集到IoC容器中。

階段二:分析和組裝

第二階段要干的事情就是分析這些已經在IoC容器之中的bean, 然后根據它們之間的依賴關系先后組裝它們。如果IoC容器發現某個bean依賴另一個bean,它就會將這另一個bean注入給依賴它的那個bean,直到所有 bean的依賴都注入完成,所有bean都“整裝待發”,整個IoC容器的工作即算完成。

二、JavaConfig 與 @Configuration

Java 5的推出,加上當年基于純Java Annotation的依賴注入框架Guice的 出現,使得Spring框架及其社區也“順應民意”,推出并持續完善了基于Java 代碼和Annotation元信息的依賴關系綁定描述方式,即JavaConfig項目

基于JavaConfig方式的依賴關系綁定描述基本上映射了最早的基于XML的配置方式,比如

  1. 表達形式層面

    基于XML的配置方式是這樣的:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi= nhttp://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans 			 http://www.springframework.org/schema/beans/spring-beans.
    xsd http://www.springframework.org/schema/context http://www. springframework.org/schema/context/spring-context.xsd">                                                 <!-- bean 定義-->
    </beans>
    

    基于JavaConfig的配置方式是這樣的:

    ?Configuration
    public class MockConfiguration{// bean定義
    }
    

    任何一個標注了 ?Configuration的Java類定義都是一個JavaConfig配 置類。

  2. 注冊bean定義層面

    基于XML的配置形式是這樣的:

    <bean id= "mockService" class="..MockServicelmpl">...
    </bean>
    

    而基于JavaConfig的配置形式是這樣的:

    ?Configuration
    public class MockConfiguration {@Beanpublic MockService mockService() {return new MockServiceJmpl()}
    }
    

    任何一個標注了 @Bean的方法,其返回值將作為一個bean定義注冊到 Spring的IoC容器,方法名將默認成為該bean定義的id。

  3. 表達依賴注入關系層面

    為了表達bean與bean之間的依賴關系,在XML形式中一般是這樣的:

    <bean id= "mockService" class="..MockServicelmpl"><property name="dependencyService" ref="dependencyservice"/>
    </bean>
    <bean id="dependencyservice" class="DependencyServicelmpl"/>
    

    而在JavaConhg中則是這樣的:

    @Configuration
    public class MockConfiguration {@Beanpublic MockService mockService() {return new MockServiceImpl(dependencyservice())}@Beanpublic Dependencyservice dependencyservice() {return new DependencyServicelmpl()}
    }
    

    如果一個bean的定義依賴其他bean,則直接調用對應JavaConfig類中依賴bean的創建方法就可以了。

三、其他高曝光率的Annotation

?Configuration在前面已經提及過了,這里不再贅述,下面看幾個其他比較常見的Annotation,便于為后面更好地理解SpringBoot框架

1、@ComponentScan

@ComponentScan: 對應 XML 配置形式中的 context:component-scan 元 素

注解作用:@ComponentScan用于類或接口上主要是指定掃描路徑,spring會把指定路徑下帶有指定注解的類自動裝配到bean容器里。會被自動裝配的注解包括@Bean、@Controller、@Service、@Component、@Repository等等。

2、@lmport 與 @lmportResource

在XML形式的配置中,我們通過<import resource=,'XXX.xml"/>的形式 將多個分開的容器配置合到一個配置中,在JavaConfig形式的配置中,我們則 使用@Import這個Annotation完成同樣目的:

@Configuration
?Import (MockConfiguration.class)
public class XConfiguration {...
}

@Import只負責引入JavaConfig形式定義的loC容器配置,如果有一些遺 留的配置或者遺留系統需要以XML形式來配置(比如dubbo框架),我們依然 可以通過@ImportResource將它們一起合并到當前JavaConfig配置的容器中:

@Configuration
@ImportResource("...")
public class XConfiguration {...
}

參考:

  • 《SpringBoot揭秘+快速構建微服務體系》 第二章
  • 淺析Spring IOC、依賴注入(DI)和依賴查找(DL)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535542.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535542.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis精解

概念Redis是完全開源免費的,遵守BSD協議,是-一個高性能的key-value數據庫。它支持存儲的value類型很多,包括string(字符串)、list(鏈表)、set(集合)、(Zset(有序集合),這些數據類型都支持。 push/pop、add/remove及 取交集和并集及更豐富的操作,Redis支持各種不同方式的排序)…

@SpringBootApplication揭秘

一、SpringBoot初體驗 一個典型的SpringBoot應用長什么樣子呢&#xff1f;如果我們使用http://start.spring.io/創建一個最簡單的依賴Web模塊的SpringBoot應用&#xff0c;一般情況下&#xff0c; 我們會得到一個SpringBoot應用的啟動類&#xff0c;如下面代碼所示&#xff1a…

SpringApplication:SpringBoot程序啟動的一站式解決方案

我們說SpringBoot是Spring框架對“約定優先于配置(Convention Over Configuration)"理念的最佳實踐的產物&#xff0c;一個典型的SpringBoot應用本質上其 實就是一個基于Spring框架的應用 如果非說SpringBoot微框架提供了點兒自己特有的東西&#xff0c;在核心類層面&…

了解spring-boot-starter

SpringBoot提供了針對日常企業應用研發各種場景的spring-boot-starter自動配置 依賴模塊&#xff0c;如此多“開箱即用”的依賴模塊&#xff0c;使得開發各種場景的Spring應用 更加快速和高效&#xff0c;本文會就幾個常見的通用spring-boot-starter模塊進行了解 一、約定優先于…

常用腳本

mysql狀態收集 #! /bin/bash#mysql for zabbixUptime() {mysqladmin status I awk [print $2]}Slow_ queries() {mysqladmin status | awk [print $9]} ICom_ insert() {mysqladmin extended-status |awk /<Com_ insertl>/[print $4]}Com_ delete() {mysqladmi…

linux產生隨機數方法

如果產生的數據長短格式不統一&#xff0c;使用md5sum命令&#xff0c;并使用cut截取相應位數echo $RANDOM openssl rand -base64 openssl rand -base64 10 date %s%N /dev/random設備&#xff0c;存儲著系統當前運行的環境的實時數據。它可以看作是系統某個時候&#x…

oracle視圖等

視圖 視圖是基于其他表或視圖創建的邏輯表 視圖不包含自己的數據&#xff0c;它基于的表稱為基表 使用視圖是為了: 限制對數據的訪問 使復雜的查詢簡單化 提供數據的獨立性 相同的數據展現不同的視圖 不能刪除行不能修改行不能添加行 --分組函數 - -GRoUP BY子句 -…

Java集合:關于 ArrayList 的內容盤點

本篇內容包括&#xff1a;ArrayList 概述、ArrayList 的擴容機制&#xff08;包含源碼部分&#xff09;、如何在遍歷 ArrayList 時正確的移除一個元素、ArrayList 的構造方法及常用方法、關于 Array 與 ArrayList 的區別、關于 CopyOnWriteArrayList、關于 Fail Fast 與 Fail S…

Java集合:關于 LinkedList 的內容盤點

本篇內容包括&#xff1a;LinkedList 的概述、LinkedList 的結構既雙向鏈表實現與LinkedList-Node 結構、LinkedList 的使用&#xff08;構造方法&常用方法&#xff09;、關于 Queue 隊列的介紹、關于 ArrayList 和 LinkedList 的區別以及算法&#xff1a;翻轉鏈表&#xf…

shell自動化巡檢

#!/bin/bash #主機信息每日巡檢IPADDR$(ifconfig eth0|grep inet addr|awk -F [ :] {print $13}) #環境變量PATH沒設好&#xff0c;在cron里執行時有很多命令會找不到 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin source /etc/profile…

Java集合:關于 Vector 的內容盤點

Vector 與 ArrayList 一樣&#xff0c;也是通過數組實現的&#xff0c;不同的是它支持線程的同步&#xff0c;即某一時刻只有一個線程能夠寫 Vector&#xff0c;避免多線程同時寫而引起的不一致性&#xff0c;但實現同步需要很高的花費&#xff0c;因此&#xff0c;訪問它比訪問…

memcached 的基本命令

memcached 的基本命令(安裝、卸載、啟動、配置相關)&#xff1a; -p 監聽的端口 -l 連接的 IP 地址, 默認是本機 -d start 啟動 memcached 服務 -d restart 重起 memcached 服務 -d stop|shutdown 關閉正在運行的 memcached 服務 -d install 安裝 memcached 服務 -d uninstall …

Java集合:關于 HashSet 的內容盤點

哈希表存放的是哈希值&#xff0c; HashSet 存儲元素的順序并不是按照存入時的順序&#xff08;和 List 顯然不同&#xff09; 而是按照哈希值來存的所以取數據也是按照哈希值取得。 &#xff5e; 本篇內容包括&#xff1a;HashSet 概述、HashSet 與 HashMap 的關系以及HashSet…

mysql備份腳本

#!/bin/bash #保留備份個數&#xff0c;會刪除時間較早的.dump備份 number3 #設置備份保存路徑&#xff0c;yourpath替換成自己的備份保存路徑 backup_diryourpath #日期格式 dddate %Y%m%d #備份工具 toolmysqldump #數據庫用戶名 usernameroot #數據庫密碼&#xff0c;由于密…

Java集合:關于 TreeSet 的內容盤點

TreeSet() 是使用二叉樹的原理對新 add() 的對象按照指定的順序排序&#xff08;升序、降序&#xff09;&#xff0c;每增加一個對象都會進行排序&#xff0c;將對象插入的二叉樹指定的位置&#xff1b; ~ 本篇內容包括&#xff1a;TreeSet 概述、TreeSet 的使用以及其他知識點…

python求素數

口求100內的素數 -個數能被從2開始到自己的平發根的正整數整數整除,就是合數 import math n100 for X in range(2, n): for i in range(2, math.ceil(math.sqrt(x))): if x %i 0: break else: print(x)口求100內的素數 合數一定可以分解為幾個質數的乘積 import math n100 pri…

svn鉤子腳本

REP0S"$1" REV"$2"export LANGen_US.UTF-8 LOGPATH"/app/log" [ !-d ${LOGPATH}] && mkdir $[LOGPATH) -p #update content from svn↓14 SVN/usr/bin/svn↓ SVN update --username test --password test /data/ if[ $? -eq ] then /us…

shell判斷字符串是否為數字

#1.組合語法判斷1: [ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g"] &&\echo”兩個參數都必須為數字”&& exit 1#2.組合語法判斷2:[ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g&…

MySQL:DQL 數據查詢語句盤點

本篇內容包括&#xff1a;DQL 的簡介、SELECT 語句、WHERE 條件語句、JOIN 連接查詢(多表查詢)和分組、過濾、排序、分頁、子查詢的使用。 一、DQL 簡介 DQL&#xff08;Data QueryLanguage&#xff09;語句&#xff0c;即數據查詢語句 常用的語句關鍵字有&#xff1a;SELECT…

MySQL:DML 數據操作語句盤點

本篇內容包括&#xff1a;DML 的簡介、INSERT 命令、UPDATE 命令、DELETE 命令以及 TRUNCATE 命令的使用。 一、DML 簡介 DML&#xff08;Data Manipulation Language&#xff09;語句&#xff0c;即數據操作語句&#xff0c;用于操作數據庫對象中所包含的數據。 常用關鍵字包…