關(guān)于對spring不是很了解的,建議看看這篇5年開發(fā)大佬寫的spring學習筆記

簡介

1、Spring是一個開源的輕量級的應用開發(fā)框架,其目的是用于簡化企業(yè)級應用程序開發(fā),降低開發(fā)者的開發(fā)難度;
(簡化開發(fā):spring對常用的api,比如對JDBC做了封裝,使用spring封裝的jdbc訪問數(shù)據(jù)庫,就不用考慮獲取連接、關(guān)閉連接等,極大的簡化了代碼)
2、Spring提供的IoC和AOP應用,可以將組件的耦合度降至最低(即解耦),便于系統(tǒng)日后的維護和升級;
3、Spring為系統(tǒng)提供了一個整體的解決方案,開發(fā)者可以利用它本身提供的功能外,也可以與第三方框架和技術(shù)整合應用,可以自由選擇采用哪種技術(shù)進行開發(fā)。(比如Spring整合SpringMVC、Spring整合MyBatis、Spring整合Struts2、Spring整合Hibernate、Spring整合Quartz[定時任務處理])

為什么要使用Spring?

1)方便解耦,簡化開發(fā)
2.AOP編程的支持
3).聲明式事務的支持
4).方便集成各種優(yōu)秀框架
5).降低Java EE API的使用難度,如對JDBC,JavaMail,遠程調(diào)用等提供了簡便封裝

Spring架構(gòu)圖

模塊 說明

  1. BeanFactory Spring內(nèi)部使用,創(chuàng)建bean的工廠
  2. ApplicationContext 外部應用程序調(diào)用,也成為spring容器的上下文
  3. IoC控制反轉(zhuǎn)
    Inversion of Control 開發(fā)者在無需自己new對象,無需關(guān)心對象的創(chuàng)建過程
    User user = new User(); 手動創(chuàng)建對象
    User user = context.getBean(user); 容器創(chuàng)建對象
  4. DI依賴注入
    Dependency Injection 松耦合方式實現(xiàn)對象直接的依賴
  5. AOP面向切面編程 補充java面向?qū)ο蟮牟蛔?/li>

Spring IOC控制反轉(zhuǎn)

什么是控制反轉(zhuǎn)

IOC(Inversion of Control),控制反轉(zhuǎn)
所謂的控制反轉(zhuǎn),就是指將對象的創(chuàng)建,對象的存儲(map),對象的管理(依賴查找,依賴注入)交給spring容器

耦合

所謂的耦合指的軟件開發(fā)中,在層與層之間產(chǎn)生了某種緊密的關(guān)系。這種關(guān)系可能會導致在我們修改或者是替換某一層時會影響其他的層,像這種情況我們稱之為層與層之間產(chǎn)生的耦合。

測試代碼

//1.從spring容器中獲取bean對象(而不是自己new)
Hello hello = (Hello) ac.getBean("hello");
//2.調(diào)用hello對象的方法
hello.sayHi();

IOC小結(jié)

這就是spring框架的IOC——控制反轉(zhuǎn)。之前我們自己new對象,例如:

User u = new User();

而現(xiàn)在,變成由一個初始化的xml配置文件來創(chuàng)建,也就是由spring容器來創(chuàng)建。

Hello hello = (Hello) ac.getBean("hello");

Bean對象的單例和多例

Bean對象的單例和多例概述
  1. singleton:單實例,是默認值。這個作用域標識的對象具備全局唯一性。
    當把一個 bean 定義設(shè)置scope為singleton作用域時,那么Spring IOC容器只會創(chuàng)建該bean定義的唯一實例。也就是說,整個Spring IOC容器中只會創(chuàng)建當前類的唯一一個對象。
    這個單一實例會被存儲到單例緩存(singleton cache)中,并且所有針對該bean的后續(xù)請求和引用都 將返回被緩存的、唯一的這個對象實例。
    singleton負責對象的創(chuàng)建、初始化、銷毀。
  2. prototype:多實例。這個作用域標識的對象每次獲取都會創(chuàng)建新的對象。
    當把一個 bean 定義設(shè)置scope為singleton作用域時,Spring IOC容器會在每一次獲取當前Bean時,都會產(chǎn)生一個新的Bean實例(相當于new的操作)
    prototype只負責對象的創(chuàng)建和初始化,不負責銷毀。

為什么要用單實例或多實例?

之所以用單實例,在沒有線程安全問題的前提下,沒必要每個請求都創(chuàng)建一個對象,這樣子既浪費CPU又浪費內(nèi)存;
之所以用多例,是為了防止并發(fā)問題;即一個請求改變了對象的狀態(tài)(例如,可改變的成員變量),此時對象又處理另一個請求,而之前請求對對象狀態(tài)的改變導致了對象對另一個請求做了錯誤的處理;
用單例和多例的標準只有一個:當對象含有可改變的狀態(tài)時(更精確的說就是在實際應用中該狀態(tài)會改變),使用多實例,否則單實例;

在Spring中配置Bean實例是單例還是多例方法是:
單例:

<bean id="hello" scope="singleton" class="com.tedu.spring.Hello"></bean>

多例:

<bean id="hello" scope="prototype" class="com.tedu.spring.Hello"></bean>

Spring DI依賴注入

兩種注入方式介紹

DI(Dependecy Injection)依賴注入。
依賴注入,及組件之間的依賴關(guān)系由容器在應用系統(tǒng)運行期來決定,也就是由容器動態(tài)地將某種依賴關(guān)系的目標對象實例注入到應用系統(tǒng)中的各個關(guān)聯(lián)的組件之中。

簡單來說,所謂的依賴注入其實就是,在創(chuàng)建對象的同時或之后,如何給對象賦值。

Spring兩種方式為屬性賦值

(1).Set方式注入
(2).構(gòu)造方法注入(spring大都使用這種方式)

最后

感謝你看到這里,看完有什么的不懂的可以在評論區(qū)問我,覺得文章對你有幫助的話記得給我點個贊,每天都會分享java相關(guān)技術(shù)文章或行業(yè)資訊,歡迎大家關(guān)注和轉(zhuǎn)發(fā)文章!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容