溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中IoC容器的介紹

發(fā)布時間:2020-05-30 12:22:26 來源:億速云 閱讀:293 作者:鴿子 欄目:編程語言

一. 什么是IoC

  1. 什么是耦合和內(nèi)聚

耦合指的就是模塊之間的依賴關系。模塊間的依賴越多,則表示耦合度越高,相應的維護成本就越高。
內(nèi)聚指的是模塊內(nèi)功能之間的聯(lián)系。模塊內(nèi)功能的聯(lián)系越緊密,則表示內(nèi)聚度越高,模塊的職責也就越單一。
所以在程序開發(fā)中應該盡量的降低耦合,提高內(nèi)聚。也就是設計原則中的開閉原則和單一職責原則。

  1. 工廠模式

工廠模式就是用來解決程序間耦合的一種設計模式??梢园阉幸獎?chuàng)建的對象放在工廠的一個集合里,當需要使用這個對象的時候,直接從工廠里面取出來用就行。

工廠模式的優(yōu)點:

一個調用者想創(chuàng)建一個對象,只需要指定相應的名字即可從工廠中獲得這個對象。
屏蔽了產(chǎn)品的具體實現(xiàn),調用者只關心產(chǎn)品的接口。

  1. 控制反轉(IoC)

控制反轉在維基百科中的定義:

控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創(chuàng)建的時候,由一個調控系統(tǒng)內(nèi)所有對象的外界實體,將其所依賴的對象的引用傳遞(注入)給它。

下面再從控制和反轉兩個詞分兩個方面來理解:

誰控制誰?IoC容器控制了對象。控制什么?控制了對象要獲取的外部資源(其它對象或數(shù)據(jù)等)
什么是反轉?是IoC容器查找并注入依賴給對象,對象是被動的接受,而不是主動的創(chuàng)建,所以是反轉。
通過new方式來主動獲取對象:

Spring中IoC容器的介紹
通過IoC容器獲取對象(注意看箭頭的方向,是不是反轉了):
Spring中IoC容器的介紹

有了IoC容器后,把創(chuàng)建和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,所以對象與對象之間是松散耦合,這樣也方便測試,利于功能復用,更重要的是使得程序的整個體系結構變得非常靈活。

  1. 依賴注入(DI)

依賴注入在維基百科中的定義

在軟件工程中,依賴注入是種實現(xiàn)控制反轉用于解決依賴性設計模式。一個依賴關系指的是可被利用的一種對象(即服務提供端) 。依賴注入是將所依賴的傳遞給將使用的從屬對象(即客戶端)。該服務是將會變成客戶端的狀態(tài)的一部分。傳遞服務給客戶端,而非允許客戶端來建立或尋找服務,是本設計模式的基本要求。

其實依賴注入和控制反轉表達的是一個意思??刂品崔D是一種思想,而依賴注入是這個思想的最典型的實現(xiàn)方法。

由IoC來控制對象的依賴,通過構造函數(shù)、變量或Setter等方法來將依賴注入到對象中,這樣就將對象和對象的依賴進行了解耦。

二. spring中的工廠類
我們常用的spring容器是ApplicationContext,先來看一下它的依賴結構。
Spring中IoC容器的介紹

由圖可知,spring容器中的頂層接口是BeanFactory。ApplicationContext是它的子接口(注意這個也是個接口哦)。它默認一讀取配置文件,就會創(chuàng)建對象放到容器中。再來看一下ApplicationContext的三個主要的實現(xiàn)類。
Spring中IoC容器的介紹

ClassPathXmlApplication:它是從類的根路徑下加載xml配置文件(推薦用這種)。
FileSystemXmlApplication: 它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。(但使用不靈活,不推薦)
AnnotationConfigApplication:當我們使用注解配置容器對象時,需要使用此類來創(chuàng)建spring容器。它用來讀取注解。(springboot默認使用這個)
三. Bean的創(chuàng)建和管理

  1. bean標簽

作用 : 用于配置對象讓spring來創(chuàng)建的。默認情況下它調用的是類中的無參構造函數(shù)。如果沒有無參構造函數(shù)則不能創(chuàng)建成功。

屬性:

id:給對象在容器中提供一一個唯一 標識。用于獲取對象。
class:指定類的全限定類名。用于反射創(chuàng)建對象。默認情況下調用無參構造函數(shù)。
scope:指定對象的作用范圍。
singleton : 單例對象,也是默認的。
prototype : 多例對象,每次都創(chuàng)建一個不同的對象。
request :WEB 項目中,Spring創(chuàng)建一個Bean的對象,將對象存入到request域中.
session : WEB項目中,Spring創(chuàng)建一個Bean的對象,將對象存入到session域中。
global session:WEB項目中,應用在集群環(huán)境.如果沒有集群環(huán)境那么globalSession相當于session.
init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷毀方法名稱。

  1. bean的作用范圍和生命周期

①. 單例對象: scope="singleton"一個應用只有一一個對象的實例。它的作用范圍就是整個引用。生命周期:

對象出生:當應用加載,創(chuàng)建容器時,對象就被創(chuàng)建了。
對象活著:只要容器在,對象-直活著。
對象死亡:當應用卸載,銷毀容器時,對象就被銷毀了。
②. 多例對象: scope="prototype"每次訪問對象時,都會重新創(chuàng)建對象實例。生命周期:

每次訪問對象時,都會重新創(chuàng)建對象實例。
對象活著:只要對象在使用中,就一直活著。
對象死亡:由java的垃圾回收器機制來處理。
四. spring中的注解

  1. 用于創(chuàng)建對象的

相當于<bean id = "" class = "" />
①. @component

作用:把資源讓spring來管理,相當于在xml中注冊一個bean。
屬性:value:指定bean的id.如果不指定value屬性,默認bean的id是當前類的類名。首字母小寫。
②.@Service 、@Repository 、@Controller他們都是對@Component注解的衍生,其實作用是一模一樣的,只是提供了更明確的語義化。

@Repository:一般用于持久層的注解。@Service:一般用于業(yè)務層的注解
br/>*/
@Autowired<br/private IAccountDao accountDao ;

/**

  • 使用構造器注入 spring推薦使用這個
  • @param accountDao 要注入的依賴*/
    @Autowired
    br/>*/
    @Autowired<br/public void setAccountDao(IAccountDao accountDao) {
    this.accountDao = accountDao;
    }
    ②. @Qualifier

作用:在自動按照類型注入的基礎之上,再按照Bean的id注入。它在給字段注入時不能獨立使用,必須和@Autowire一起使用;但是給方法參數(shù)注入時,可以獨立使用。
屬性:value:指定bean的id.
③. @Resource

作用:@Resource采用 name 屬性。默認情況下,Spring 將 value 解釋為要注入的 bean name。也就是ByName注入。
屬性:value:指定bean的id.
④. @Value

作用:用于注入基本類型數(shù)據(jù)和String類型數(shù)據(jù)
屬性:用于指定值,可使用SpEL表達式。

  1. 用于改變作用域的

相當于<bean id = "" class = "" scope = ""/>中的scope屬性
①. @Scope

作用:指定bean的作用范圍。
屬性:value:指定bean的作用范圍。取值: singleton prototype request session globalsession。

  1. 生命周期相關的

相當于<bean id = "" class = "" init-method = "" destory-method = ""/>中的init-method屬性和destory-method屬性
①. @PostConstruct

作用:用于指定初始化方法

②. @PostDestory

作用:用于指定銷毀方法

  1. spring中的新注解

①. @Configuration

作用:用于指定當前類是一個spring配置類,當創(chuàng)建容器時會從該類上加載注解。獲取容器時需要使用AnnotationApplicationContext (有@Configuration注解的類. class)。
屬性:value:用于指定配置類的字節(jié)碼
②. @ComponentScan

作用:用于指定spring在初始化容器時要掃描的包。作用和在spring的xml配置文件中的<context : component-scan base-package="com. itheima"/>是一樣的。
屬性:basePackages: 用于指定要掃描的包。和該注解中的value屬性作用一樣。
③. Bean

作用:該注解只能寫在方法(該方法的返回值作為bean放到容器中)上,表明使用此方法創(chuàng)建一個對象, 并且放入spring容器。
屬性:name:給當前@Bean注解方法創(chuàng)建的對象指定一個名稱 (即bean的id)。
④. @PropertySource

作用:用于加載.properties文件中的配置。例如我們配置數(shù)據(jù)源時,可以把連接數(shù)據(jù)庫的信息寫到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
屬性:value[] :用于指定properties文件位置。如果是在類路徑下,需要寫上classpath:。
示例:

@Configuration@PropertySource("classpath:jdbc.properties")<br/" rel="nofollow">br/>@PropertySource("classpath:jdbc.properties")<br/public class JdbcConfig{
}
⑤. @Import

作用:用于導入其他配置類,在引入其他配置類時,可以不用再寫@Configuration注解。當然,寫上也沒問題。
屬性:value[] :用干指定其他配置類的字節(jié)碼。
示例:

@Configuration
@ComponentScan(basePackages = "com.ncusoft.springDemos")
@Import({ JdbcConfig.class })
public class SpringConfiguration {
}

  1. 選擇XML還是注解?

先來看一下各自的優(yōu)勢:

注解的優(yōu)勢:配置簡單,維護方便(我們找到類,就相當于找到了對應的配置)。
XML的優(yōu)勢:修改時,不用改源碼。不涉及重新編譯和部署。
應該根據(jù)實際的開發(fā)來選擇使用(springboot推薦使用注解),一般在source code(源代碼)中的類使用注解來創(chuàng)建bean(更方便,只需一個注解搞定)。從外部引入的依賴可選擇使用XML來創(chuàng)建bean。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI