系統學習SpringFramework:Spring IOC

本篇內容包括:IOC 和 DI 的概念、Spring 容器,即 BenaFactory 與 AplicationConext 等 IOC 相關內容。

一、IOC 和 DI 的概念

1、IOC

IoC(Inversion of control )即“控制反轉”,它是一種設計思想而非一個技術實現。描述了Java 開發領域對象的創建以及管理的問題。通過Spring來管理對象的創建、配置和生命周期,這樣相當于把控制權交給了Spring,不需要人工來管理對象之間復雜的依賴關系,這樣做的好處就是解耦。

Spring 實現 IOC 的重要手段是依賴注入 DI 對象間的依賴的控制權從開發人員手中轉移到了容器中,降低了開發成本.

在 Spring 里面,主要提供了 BeanFactory 和 ApplicationContext 兩種 IOC 容器,通過他們來實現對 Bean 的管理。

2、DI

IoC 最常見以及最合理的實現方式叫做依賴注入(Dependency Injection,簡稱 DI)。

依賴注入(DI,Dependency Injection)是 Spring 實現 IOC 的重要手段,依賴注入將對象間的依賴的控制權從開發人員手中轉移到了容器中,降低了開發成本。

3、IOC 容器

在Spring里面,主要提供了 BeanFactory 和 ApplicationContext 兩種 IOC 容器,通過他們來實現對 Bean 的管理。

  • BeanFactory 粗暴簡單,可以理解為就是個 HashMap,Key 是 BeanName,Value 是 Bean 實例。通常只提供注冊(put),獲取(get)這兩個功能。我們可以稱之為 “低級容器”。

  • ApplicationContext 可以稱之為 “高級容器”。因為他比 BeanFactory 多了更多的功能。他繼承了多個接口。因此具備了更多的功能。


二、Spring 容器設計

1、BenaFactory

BenaFactory 可以說是 IOC 最頂層的接口,其定義了一個 IOC 容器的基本規范,可以說 BenaFactory 就是一個低配版的 IOC 容器,其定義了 IOC 容器最基本的功能

BeanFactory 使用控制反轉對應用程序的配置和依賴性規范與實際的應用代碼進行分離,BeanFactory 實例化后并不會自動實例化 Bean,只有當 Bean 被使用時才會對其進行實例化與依賴關系的裝配。

public interface BeanFactory {//對 FactoryBean 的轉義定義,因為如果使用 bean 的名字檢索 FactoryBean 得到的對象是工廠生成的對象,如果需要得到工廠本身,需要轉義。String FACTORY_BEAN_PREFIX = "&";//根據 bean 的名字,獲取在 IOC 容器中得到 bean 實例。Object getBean(String name) throws BeansException;//根據 bean 的名字和 Class 類型來得到 bean 實例,增加了類型安全驗證機制。<T> T getBean(String name, Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);//提供對 bean 的檢索,看看是否在 IOC 容器有這個名字的 bean。boolean containsBean(String name);//根據 bean 名字得到 bean 實例,并同時判斷這個 bean 是不是單例。boolean isSingleton(String name) throws NoSuchBeanDefinitionException;//根據 bean 名字得到 bean 實例,并同時判斷這個 bean 是不是原型。boolean isPrototype(String name) throws NoSuchBeanDefinitionException;//判斷 bean 名字和 Type 判斷 JavaBean 是否匹配指定的類型boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;//得到 bean 實例的 Class 類型@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;@NullableClass<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;//得到 bean 的別名,如果根據別名檢索,那么其原名也會被檢索出來String[] getAliases(String name);}

可以看到,在 BeanFactory 里只對 IOC 容器的基本行為作了定義,根本不關心你的 Bean 是如何定義怎樣加載的。而要知道 Bean 是如何定義怎樣加載的,我們需要看具體的 IOC 容器實現,Spring 提供了許多 IOC 容器的 實現 。比如 GenericApplicationContext 與 ClasspathXmlApplicationContext 。

2、AplicationConext

ApplicationContext 是 Spring 中的核心接口和容器,允許容器通過應用程序上下文環境創建、獲取、管理 bean。在構建容器的時候,創建對象采用的策略是立即加載的方式,即只要一讀取完配置文件就立即創建配置文件中配置的對象(BeanFactory采用的是延遲加載的方式,什么時候根據 id 獲取對象了,什么時候才真正地創建對象)。

在這里插入圖片描述

從以上類圖我們可以看出 ApplicationContext 繼承了 6 個接口,除了繼承自 BeanFactory 的 HierarchicalBeanFactory 和 ListableBeanFactory 以外,還包括了:EnvironmentCapable、

ApplicationEventPublisher、ResourcePatternResolver 和 MessageSource。

  • EnvironmentCapable:簡單地說就是獲取環境變量,定義了 ApplicationContext 啟動時的環境,為應用程序環境的兩個關鍵方面建模:配置文件和屬性;
  • ApplicationEventPublisher:主要是做事件(ApplicationEvent)傳播、事件發布的功能;
  • ResourcePatternResolver:主要是做資源(Resource)加載,支持多種類型加載;
  • MessageSource:國際化,國際化簡而言之就是說國際通用的意思,那就是需要不同的語言進行翻譯,這個是可以自定義的,在資源文件夾下創建。

### Spring 的三個主要實現類

  • ClassPathXmlApplicationContext:可以加載類路徑下的配置文件,要求配置文件必須在類路徑之下;
  • FileSystemXmlApplicationContext:可以加載磁盤中任意路徑下的配置文件,要求具有訪問權限;
  • AnnotationConfigApplicationContext:用于讀取注解創建容器。

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

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

相關文章

徹底卸載oracle

linux刪除Oracle安裝目錄下的所有文件和文件夾即可。windows 1.關閉oracle所有的服務。可以在windows的服務管理器中關閉 2.打開注冊表&#xff1a;regedit 打開路徑&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 刪除該路徑下的所有以oracle開始的服務…

系統學習SpringFramework:Spring AOP

本篇內容包括&#xff1a;Spring AOP 概述&#xff08;AOP 簡介、AOP 為什么叫面向切面編程、AOP 主要用來解決的問題 和 AOP 的相關術語&#xff09;、Spring AOP Demo&#xff08;xml 方式、注解方式&#xff09;以及相關知識點&#xff08;JDK 動態代理和 CGLIB 代理、Sprin…

rowid

ROWID的格式rowidOOOOOOFFFBBBBBBRRR說明數據對象號相對文件號數據塊號行號 上述表格是Oracle 9i及以上版本數據庫中的rowid格式: 6位對象號3位相對文件號6位數據塊號3位行號&#xff0c;是一個18位的64進制值。這個18位的64進制值在數據庫內卻是以10個bytes合計80個bit的二進制…

git和gitlab安裝

1.下載git最新包 https://mirrors.edge.kernel.org/pub/software/scm/git/ 將最新包上傳至服務器/home目錄 tar -Jxvf 解壓 進入git目錄 ./configure --prefix/usr/local/git make make install 錯誤解決&#xff1a;Cant locate ExtUtils/MakeMaker.pm in INC yum i…

系統學習SpringFramework:循環依賴與三級緩存

本篇內容包括&#xff1a;Spring 中的循環依賴問題&#xff08;包括 Spring 中的循環依賴問題和Spring 中的循環依賴的 5 種場景的介紹&#xff09;、Spring 三級緩存介紹、4 個 Spring 無法自動解決的循環以來場景以及其對應的手動解決方式。 一、Spring 中的循環依賴問題 1、…

oracle安裝需要的包列表

redhat7.5安裝圖形界面&#xff1a; [rootwwyt ~]# rpm -ivh --nodeps --force xorg-x11-font* [rootwwyt ~]# mount -o loop -t iso9660 rhel-server-7.5-x86_64-dvd.iso /media/iso/ [rootwwyt ~]# cat /etc/yum.repos.d/my.repo [base] nameredhat7.5 baseurlfile:///m…

深入理解Java虛擬機:Java類的加載機制

本篇內容包括&#xff1a;Java 類的加載機制&#xff08;Jvm 結構組成、Java 類的加載&#xff09;、類的生命周期&#xff08;加載-驗證-準備-解析-初始化-使用-卸載&#xff09;、類加載器 以及 雙親委派模型。 一、Java 類的加載機制 1、 Jvm 結構組成 Jvm 整體組成可分為…

新版谷歌瀏覽器開啟Flash支持

瀏覽器地址欄中輸入chrome://version查看Chrome瀏覽器、Flash插件的版本信息。 Chrome 69.0-70.0版本Chrome 71.0-74.0及以后版本谷歌瀏覽器地址欄中輸入【chrome://flags/#enable-ephemeral-flash-permission】&#xff0c;將【Enable Ephemeral Flash Permissions】從【Defau…

深入理解Java虛擬機:Java垃圾回收機制

本篇內容包括&#xff1a;JAVA 垃圾回收機制概述、有哪些內存需要回收、如何回收&#xff08;標記-清除、標記-整理&#xff08;標記-清除-壓縮&#xff09;、復制&#xff08;標記-復制-清除&#xff09;、分代收集等算法&#xff09; 以及 何時進行垃圾回收等內容&#xff01…

深入理解Java虛擬機:Java垃圾回收器

本篇內容包括&#xff1a;7 種 Jvm 垃圾回收器的介紹、對比 以及 對應的 Jvm 參數設置&#xff0c;這 7 種包括了&#xff1a;Serial、ParNew 以及 Parallel Scavenge 三種新生代回收器 和 &#xff1a;Serial Old、Parallel Old 以及 CMS 三種老年代回收器&#xff0c;此外還有…

oracle跨越千年處理

如果指定的兩位年份0-4950-99 如果當前 的兩位年 份是 0-49返回的日期是當前世紀返回的日期是上個世紀50-99返回的日期是下個世紀返回的日期是當前世紀 current yearSpecified DateRR FormatYY Format199527-OCT-9519951995199527-OCT-171951917200127-OCT-1720012017200127-OC…

網絡協議:什么是網絡分層的七四五

本篇內容包括&#xff1a;網絡分層七層、五層、四層網絡協議概念的介紹&#xff0c;IOS 體系結構的介紹與構成、TCP/IP體系結構的簡介及與IOS體系的關系 以及五層體系結構的介紹。 一、七層、五層、四層網絡協議概念 1、關于網絡協議 網絡協議&#xff0c;即是指計算機網絡中…

查看表空間相關命令

默認表空間數據文件大小根據DATA BLOCKS的大小有關&#xff0c;默認最大為32GB表空間達到32G&#xff0c;只能增加數據文件alter tablespace 表空間名 add datafile 數據文件路徑‘ size 500m autoextend on next 100m maxsize 10000M;未達到32G&#xff0c;修改數據文件的擴展…

網絡協議:一文搞懂Socket套接字

本篇內容包括&#xff1a;Socket 套接字的簡介、Socket 套接字的分類、Java 中的 Socket 即 java.net.ServerSocket、java.net.Socket 的使用&#xff0c;以及Java 使用套接字 Scoket 編程的Demo。 一、Socket 簡介 TCP&#xff08;傳輸控制協議&#xff09;是一種面向連接的、…

RESETLOGS

使用resetlogs選項&#xff0c;會把當前的日志序號&#xff08;log sequence number&#xff09;重設為1&#xff0c;并拋棄所有日志信息。在以下條件時需要使用resetlogs選項&#xff1a; 在不完全恢復&#xff08;介質恢復&#xff09;&#xff1b; 使用備份控制文件。 使…

網絡協議:透徹解析HTTP協議

本篇內容包括&#xff1a;HTTP 協議定義及其特點概述、關于 URL 定義及分類概述、Request 請求、Response 響應 以及 瀏覽器訪問一個網站的全過程 等內容… 一、HTTP 協議概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 即 超文本傳輸協議&#xff0c;它是一種…

oracle參數文件和口令文件

外部 審核 口令&#xff1a;記錄超級用戶的用戶名和口令&#xff0c;做sys用戶的安全審核 oracle9以后全部使用sys登錄&#xff0c;但需要使用as sysdba &#xff0c;之前版本需要使用internal o7字典打開 只要用戶和密碼存在于口令文件&#xff0c;就可以以sysdba登錄&#…

innobackup備份恢復實操步驟--gtid復制(1)(1)

首先在主庫進行備份&#xff1a; 備份命令&#xff1a; Innobackupex --defaults-file/app/dbcluster/sgrdb/mysql/my19103.cnf --no-timestamp --userdbscale --passwordS6000dbscale --host10.157.43.224 --port19103 /data/backup 如果使用setsid&#xff1a; setsid …

Redis系列:Redis的概述與安裝

Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的&#xff0c;開源的&#xff08;BSD許可&#xff09;高性能非關系型&#xff08;NoSQL&#xff09;的鍵值對數據庫。 本篇內容包括&#xff1a;Redis 簡介&#xff08;為什么快&#xff1f;為什么單線程&#xff1f;優…