Spring歸納總結
前言 現如今,Spring已經是一站式的開源框架解決方案,而且形成了Spring生態。作為Java程式設計師,Spring框架是必然要學習的,在工作也是無論如何繞不開的。今天重新回顧了一下Spring,在此做一個歸納總結。
Spring框架本身有四大原則
1.使用POJO進行輕量級和最小侵入式開發
2.通過依賴注入和基於介面程式設計實現鬆耦合
3.通過AOP和預設習慣進行宣告式程式設計
4.使用AOP和模板減少模式化程式碼
Spring所有功能的設計和實現都是基於此四大原則的。面試題:選擇使用Spring框架的原因(Spring框架為企業級開發帶來的好處有哪些)?
答:可以從以下幾個方面作答: - 非侵入式:支援基於POJO的程式設計模式,不強制性的要求實現Spring框架中的介面或繼承Spring框架中的類。 - IoC容器:IoC容器幫助應用程式管理物件以及物件之間的依賴關係,物件之間的依賴關係如果發生了改變只需要修改配置檔案而不是修改程式碼,因為程式碼的修改可能意味著專案的重新構建和完整的迴歸測試。有了IoC容器,程式設計師再也不需要自己編寫工廠、單例,這一點特別符合Spring的精神"不要重複的發明輪子"。 - AOP(面向切面程式設計):將所有的橫切關注功能封裝到切面(aspect)中,通過配置的方式將橫切關注功能動態新增到目的碼上,進一步實現了業務邏輯和系統服務之間的分離。另一方面,有了AOP程式設計師可以省去很多自己寫代理類的工作。 - MVC
Spring中的一些概念和思想 IOC 控制反轉,將物件的建立權反轉(交給)Spring容器。實現了程式的解耦合。 DI 依賴注入,需要有IOC環境,Spring建立這個類的過程中將這個類所依賴的屬性設定進去。 依賴注入的主要目的是為了解耦,Spring IOC容器(Application Context)負責建立bean,並通過容器將功能類bean注入到你需要的bean中 Spring的相關配置
<!-- 方式一:無引數的構造方法的例項化 -->
<bean id="bean1" class="com.spring.demo3.Bean1"></bean>
補充:前提是該類存在無引數的構造方法,背後的原理是通過反射例項化,這種方式是實際中最常用的,除此之外還有靜態工廠例項化、 例項工廠例項化。 註解方式(首先需要在xml中開啟註解掃描) @Component @Controller @Service @Repository 補充:目前這4個註解功能是一樣的,只是為了讓標註類的用途更加清晰。Spring在後續版本中可能會對它們進行增強,@Controller通常用於控制器,@Service通常用於業務邏輯類,@Repository通常用於倉儲類(例如我們的DAO實現類),普通的類用@Component來標註。 2.2 bean的屬性注入 xml方式 構造方法注入 setter方法注入 物件型別注入(ref屬性) 介面注入,p名稱空間注入,複雜型別的注入等... 補充:實際開發中要麼利用value直接給出屬性值,要麼通過ref引用另一個bean。其他的幾乎不用
<bean id="" class="">
<property name="" value=""> 或者 <property name="" ref="">
</bean>
註解方式(首先需要在xml中開啟註解掃描) @Value :用於注入普通型別. @Autowired 預設按照型別注入,但是,如果匹配多個型別一致的物件,將無法選擇具體注入哪一個物件。解決方法:可以結合@Qualifier進行名稱注入,告訴spring容器自動裝配哪個名稱的物件
@Autowired // 自動裝配
@Qualifier("car1") // 指定裝載名為 car1 的物件
private Car car;
@Resource 預設按照名稱注入,如果找不到才按照型別注入。實際開發中,注入應該是確定的,那麼按照名稱注入,應該是首選。
@Resource(name="car1") // 手動注入,指定注入哪個名稱的物件
private Car car;
2.3 bean的作用範圍
通過@Scope配合來宣告可選項有如下幾種(實際開發中singleton和prototype最常用) singleton :預設值,單例,一個Spring容器中只有一個bean的例項全容器共享一個例項 prototype :多例,每次呼叫都會新建一個bean的例項 request :web專案中,給每一個http request新建一個bean例項 session:web專案中,給每一個http session新建一個bean例項 globalsession :同一個全域性session共享一個bean
面試題:
依賴注入時如何注入集合屬性? 答:可以在定義Bean屬性時,通過<list> / <set> / <map> / <props>分別為其注入列表、集合、對映和鍵值都是字串的對映屬性。
Spring中的自動裝配有哪些限制? 答: - 如果使用了構造器注入或者setter注入,那麼將覆蓋自動裝配的依賴關係。 - 基本資料型別的值、字串字面量、類字面量無法使用自動裝配來注入。 - 優先考慮使用顯式的裝配來進行更精確的依賴注入而不是使用自動裝配。
此時到這裡,你會發現spring中有兩種方式進行配置,xml和註解配置,xml結構清晰,註解開發方便。實際開發中,我們通常會選用兩種結合的方式。基本配置比如資料庫配置使用xml方式,開事務 配置bean通常選擇註解方式。
關於AOP AOP可以在不修改原始碼的情況下,對程式進行增強。AOP的實現,一種橫向抽取機制,依賴於動態代理模式。AOP 可以進行許可權校驗,日誌記錄,效能監控,事務控制. Spring中AOP的概念 Spring能夠為容器中管理的物件生成動態代理物件,以前我們需要自己手動生成,現在由spring幫我們生成代理物件。 Spring實現AOP的原理 動態代理(有介面的情況下優先使用) 被代理物件必須要實現介面,才能產生代理物件,如果沒有介面將不能使用動態代理技術 cglib代理(沒有介面時使用) 第三方代理技術,可以對任何類生成代理,其原理是對目標物件進行繼承代理,如果目標物件被final修飾,那麼該類無法被cglib代理。 SpringAop一些概念: join point(連線點): 連線點.所有可以增強的方法 point cut (切入點): 需要|已經增強的方法 advice(通知/增強): 需要增強的程式碼. weaving(織入): 將通知應用到切點的過程. target(目標物件): 被代理物件. proxy(代理): 將通知織入到目標物件之後,形成代理物件 aspect(切面): 切入點+通知 Introduction(引介):引介是一種特殊的通知在不修改類程式碼的前提下, Introduction 可以在執行期為類動態地新增一些方法或 Field.【面試題】
解釋一下什麼叫AOP(面向切面程式設計)? 答:AOP(Aspect-Oriented Programming)指一種程式設計範型,該範型以一種稱為切面(aspect)的語言構造為基礎,切面是一種新的模組化機制,用來描述分散在物件、類或方法中的橫切關注點(crosscutting concern)。
你是如何理解"橫切關注"這個概念的? 答:"橫切關注"是會影響到整個應用程式的關注功能,它跟正常的業務邏輯是正交的,沒有必然的聯絡,但是幾乎所有的業務邏輯都會涉及到這些關注功能。通常,事務、日誌、安全性等關注就是應用中的橫切關注功能。
Spring整合JDBC Spring提供了很多模板類整合DAO技術 Spring的事務管理 編碼式 xml配置(aop) 註解配置(aop) 用的最多的就是基於註解的方式
Spring與web整合 簡單的說就是在web.xml中去配置一個監聽器,然後指定Spring的配置檔案即可。 整合原理: 每一個WEB專案,都存在一個ServletContext物件,而我們配置的監聽器就是對它進行監聽,監聽器會載入Spring的配置檔案,把建立的物件放到ServletContext域(也就是setAttribute方法),獲取物件的時候直接getAttribute即可!