关于spring框架
Spring框架
- 一、spring框架是啥
- 1.1 是什么?
- 1.2 Spring的優勢
- 1.3 體系結構
- 1.4 快速入門開發步驟
- 1.4.1快速入門中涉及spring核心配置文件中的一個標簽
- 1.4.2快速入門中涉及標簽代表的bean的實例化時機
- 1.4.3快速入門中涉及標簽代表的bean生命周期配置
- 1.4.4Bean實例化三種方式
- 二、spring框架的IOC常見面試題(反轉控制(創建權移交))
- 2.1、什么是Spring IOC 容器?
- 2.2、 聊一下IOC的優缺點?
- 2.3、有哪些不同類型的依賴注入方式?
- 2.4、談談Spring IOC 與 DI的理解
- 2.5、IOC的意義何在?
- 三、spring框架的AOP常見面試題(面對切面編程)
- 3.1AOP是什么?面向切面編程,不修改源碼進行主干功能增強
- 3.1 AOP的應用場景有哪些呢?
- 3.2springAop的底層是怎樣實現的?
- 3.3 是編譯時期進行織入,還是運行期進行織入?
- 3.4 初始化時期織入還是獲取對象時織入?
- 3.5 spring AOP 默認使用jdk動態代理還是cglib?
- 3.6 spring AOP 和 AspectJ的關系?
- 3.7 能不能簡單說下AOP中的切面、切點、連接點、通知,四者的關系?
一、spring框架是啥
1.1 是什么?
、Spring是分層的 Java SE/EE應用 full-stack (全棧:各層都有解決方案)輕(輕和重的理解(輕:小巧,api使用簡單 學習成本低))量級開源框架,以IoC(Inverse Of Control:反轉控制 :控制誰 反轉誰 --》bean的創建權)、AOP(Aspect Oriented Programming:面向切面編程)為內核。提供了展現層 SpringMVC(web層)和持久層 Spring JDBCTemplate(Dao層)以及業務層事務管理等眾多的企業級應用技術,還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的Java EE 企業應用開源框架
1.2 Spring的優勢
1、方便解耦(把對象的創建權給spring完成 在獲取對象時不用去new 而是去找容器),簡化開發(IOC(這個容器)控制反轉)
2、AOP(是一種思想) 編程的支持
3、聲明式事務的支持:可以將我們從單調范夢的事物管理代碼中解脫,通過聲明式配置事務
4、方便程序的測試
5、方便繼承各種優秀的框架
6、降低javaee API的使用難度:對之前工具的封裝 封裝后叫–》莫莫的模版
7、java源碼經典學習范例
1.3 體系結構
體系的具體解析:
test:是說 整個spring都可以進行test 測試
sp EL(expression language)(表達式語言)
核心容器的學習 可以理解為 學習IOC的知識點
數據訪問層 ---- web
1.4 快速入門開發步驟
①導入 Spring 開發的基本包坐標
②編寫 Dao 接口和實現類(bean bean不單止entity包下的標準類)
③創建 Spring 核心配置文件
④在 Spring 配置文件中配置 UserDaoImpl
⑤使用 Spring 的 API (spring客戶端對象 applicationcontext) 獲得 Bean 實例
1.4.1快速入門中涉及spring核心配置文件中的一個標簽
基本屬性:
id:Bean實例在Spring容器中的唯一標識
class:Bean的全限定名稱
特殊屬性:
scope:指對象的作用范圍,取值如下:
| singleton | 默認值 ,單例的 |
| prototype | 多例的 |
| request | WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中 |
| session | WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中 |
| global session | WEB 項目中,應用在 Portlet 環境,如果沒有 Portlet 環境那么globalSession 相當于 session |
1.4.2快速入門中涉及標簽代表的bean的實例化時機
1)當scope的取值為singleton時: Bean的實例化時機:當Spring核心文件被加載時,實例化配置的Bean實例
2)當scope的取值為prototype時:當調用getBean()方法時實例化Bean
1.4.3快速入門中涉及標簽代表的bean生命周期配置
1)當scope的取值為singleton時:
對象創建:當應用加載,創建容器時,對象就被創建了
對象運行:只要容器在,對象一直活著
對象銷毀:當應用卸載,銷毀容器時,對象就被銷毀了
2)當scope的取值為prototype時:
對象創建:當使用對象時,創建新的對象實例
對象運行:只要對象在使用中,就一直活著
對象銷毀:當對象長時間不用時,被 Java 的垃圾回收器(JC垃圾回收機制)回收了
3)相關屬性
init-method:指定類中的初始化方法名稱
destroy-method:指定類中銷毀方法名稱 ,手動關容器
1.4.4Bean實例化三種方式
1) 使用無參構造方法實例化
2) 工廠靜態方法實例化
3) 工廠實例方法實例化
二、spring框架的IOC常見面試題(反轉控制(創建權移交))
2.1、什么是Spring IOC 容器?
IOC稱為控制反轉,也有一種說法叫DI(依賴注入)。IOC也是spring最核心的模塊,Spring的所有工作幾乎都圍繞著IOC展開。什么是控制反轉呢?簡單的說,控制反轉就是把我們要做的事情交給別人來做,就像是招了個小弟專門為我們做事情,我們需要做好的東西時直接去找小弟拿。這里要做的事情就是new 一個對象。我們不再自己去new對象然后使用,而是spring容器幫我們去創建對象然后我們要用的時候直接去拿就行了。spring幫我們生成對象就是控制反轉,而我們要用對象從spring取對象就是依賴注入。
2.2、 聊一下IOC的優缺點?
spring以動態靈活的方式來管理對象 , 注入的兩種方式,set注入和構造注入。
設置注入的優點:直觀,自然
構造注入的優點:可以在構造器中決定依賴關系的順序。
2.3、有哪些不同類型的依賴注入方式?
構造器注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。
Set方法注入:Setter方法注入是容器通過調用無參構造器或無參static工廠 方法實例化bean之后,調用該bean的setter方法,即實現了基于setter的依賴注入。
注解注入方式:引入注解約束,配置組件掃描。類上的注解: @Conponent @Controller @Service @Repository,普通屬性的注解 @value,對象屬性的注解 @Resource @Autowired @Qualifier,Bean生命周期,初始化與銷毀: @PostConstruct @PreDestroy,Bean作用范圍:@Scope(“prototype”) , 默認是singleton
2.4、談談Spring IOC 與 DI的理解
A、較淺的層次——從名字上解析
“控制”就是指對 對象的創建、維護、銷毀等生命周期的控制,這個過程一般是由我們的程序去主動控制的,如使用new關鍵字去創建一個對象(創建),在使用過程中保持引用(維護),在失去全部引用后由GC去回收對象(銷毀)
“反轉”就是指對 對象的創建、維護、銷毀等生命周期的控制由程序控制改為由IOC容器控制,需要某個對象時就直接通過名字去IOC容器中獲取。
B、更深的層次——提到DI,依賴注入,是IOC的一種重要實現
一個對象的創建往往會涉及到其他對象的創建,比如一個對象A的成員變量持有著另一個對象B的引用,這就是依賴,A依賴于B。IOC機制既然負責了對象的創建,那么這個依賴關系也就必須由IOC容器負責起來。負責的方式就是DI——依賴注入,通過將依賴關系寫入配置文件,然后在創建有依賴關系的對象時,由IOC容器注入依賴的對象,如在創建A時,檢查到有依賴關系,IOC容器就把A依賴的對象B創建后注入到A中(組裝,通過反射機制實現),然后把A返回給對象請求者,完成工作。
2.5、IOC的意義何在?
IOC并沒有實現更多的功能,但它的存在使我們不需要很多代碼、不需要考慮對象間復雜的耦合關系就能從IOC容器中獲取合適的對象,而且提供了對 對象的可靠的管理,極大地降低了開發的復雜性。
三、spring框架的AOP常見面試題(面對切面編程)
3.1AOP是什么?面向切面編程,不修改源碼進行主干功能增強
與OOP對比,面向切面,傳統的OOP開發中的代碼邏輯是至上而下的過程中會長生一些橫切性問題,這些橫切性的問題和我們的主業務邏輯關系不會散落在代碼的各個地方,造成難以維護,AOP的編程思想就是把業務邏輯和橫切的問題進行分離,從而達到解耦的目的,使代碼的重用性和開發效率高(目的是重用代碼,把公共的代碼抽取出來)
3.1 AOP的應用場景有哪些呢?
1、日志記錄
2、權限驗證
3、效率檢查(個人在代碼上,喜歡用注解+切面,實現校驗,redis分布式鎖等功能)
4、事務管理(spring 的事務就是用AOP實現的)
3.2springAop的底層是怎樣實現的?
1、JDK動態代理
2、CGLIB代理
3.3 是編譯時期進行織入,還是運行期進行織入?
---->運行期,生成字節碼,再加載到虛擬機中,JDK是利用反射原理,CGLIB使用了ASM原理。
3.4 初始化時期織入還是獲取對象時織入?
----》初始化的時候,已經將目標對象進行代理,放入到spring 容器中
3.5 spring AOP 默認使用jdk動態代理還是cglib?
-----》要看條件,如果實現了接口的類,是使用jdk。如果沒實現接口,就使用cglib。
3.6 spring AOP 和 AspectJ的關系?
1、兩者都是為了實現AOP這個目的,而出現的技術,spring aop 參考 AspectJ編程風格
—》這里有個故事就是,原本spring aop 初期的時候所用的編程風格,讓人用起來,很不方便,而且讓人看不懂。后來,spring aop 就開始取用了Aspectj的編程風格去進行編程
3.7 能不能簡單說下AOP中的切面、切點、連接點、通知,四者的關系?
aspect 切面
Point cut (如果理解了這個切點的概念,就在應用方面完全是可以的了)表示連接點的集合(類似一個表)
Join point 目標對象中的方法(每一條記錄)
weaving 把代理邏輯加入到目標對象上的過程叫做織入
advice 通知類型
總結
以上是生活随笔為你收集整理的关于spring框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构1800题 (陈守孔) 第2章
- 下一篇: OpenGL Qt环境配置