Spring知識點初步整理
基本概念
Spring優(yōu)點
輕量級,非侵入式
-對現(xiàn)有的類結(jié)構(gòu)沒有影響

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)與策劃設(shè)計,武進網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:武進等地區(qū)。武進做網(wǎng)站價格咨詢:18982081108可以提供眾多服務(wù),如事務(wù)管理,WS等
AOP的很好支持,方便面向切面編程,使得業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開
對主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等,像一個膠水一樣,把一些好的框架粘合在一起方便實用
使用Spring的IOC容器,將對象之間的依賴關(guān)系交給Spring,降低組件之間的耦合性,讓我們更專注于應(yīng)用邏輯
Spring DI機制降低了業(yè)務(wù)對象替換的復雜性。
Spring的高度可開放性,并不強制依賴于Spring,開發(fā)者可以自由選擇Spring部分或全部
Spring缺點
- 缺少一個公用控制器
- 沒有SpringBoot好用
- Spring像一個膠水,將框架黏在一起,后面拆分的話就不容易拆分了
AOP
實現(xiàn)原理
- jdk動態(tài)代理
- 主要通過Proxy.newProxyInstance()和InvocationHandler這兩個類和方法實現(xiàn)
- 實現(xiàn)過程
- 創(chuàng)建代理類proxy實現(xiàn)Invocation接口,重寫invoke()方法
- 調(diào)用被代理類方法時默認調(diào)用此方法
- 將被代理類作為構(gòu)造函數(shù)的參數(shù)傳入代理類proxy
- 調(diào)用Proxy.newProxyInsatnce(classloader,interfaces,handler)方法生成代理類
- 生成的代理類
- $Proxy0 extends Proxy implements Person
- 因為已經(jīng)繼承了Proxy,所以java動態(tài)代理只能對接口進行代理
- 代理對象會實現(xiàn)用戶提供的這組接口,因此可以將這個代理對象強制類型轉(zhuǎn)化為這組接口中的任意一個
- 通過反射生成對象
- 總結(jié): 代理類調(diào)用自己方法時,通過自身持有的中介類對象來調(diào)用中介類對象的invoke方法,從而達到代理執(zhí)行被代理對象的方法。
- cglib
- 生成對象類型為Enhancer
- 實現(xiàn)原理類似于 jdk 動態(tài)代理,只是他在運行期間生成的代理對象是針
對目標類擴展的子類
- 靜態(tài)代理
- 缺點
- 如果要代理一個接口的多個實現(xiàn)的話需要定義不同的代理類
- 代理類 和 被代理類 必須實現(xiàn)同樣的接口,萬一接口有變動,代理、被代理類都得修改
- 在編譯的時候就直接生成代理類
- JDK動態(tài)代理和cglib的對比
- CGLib所創(chuàng)建的動態(tài)代理對象在實際運行時候的性能要比JDK動態(tài)代理高
- 1.6和1.7的時候,CGLib更快
- 1.8的時候,jdk更快
- CGLib在創(chuàng)建對象的時候所花費的時間卻比JDK動態(tài)代理多
- singleton的代理對象或者具有實例池的代理,因為無需頻繁的創(chuàng)建代理對象,所以比較適合采用CGLib動態(tài)代理,反之,則適合用JDK動態(tài)代理
- JDK動態(tài)代理是面向接口的,CGLib動態(tài)代理是通過字節(jié)碼底層繼承代理類來實現(xiàn)(如果被代理類被final關(guān)鍵字所修飾,那么會失?。?/li>
- JDK生成的代理類類型是Proxy(因為繼承的是Proxy),CGLIB生成的代理類類型是Enhancer類型
- 如果要被代理的對象是個實現(xiàn)類,那么Spring會使用JDK動態(tài)代理來完成操作(Spirng默認采用JDK動態(tài)代理實現(xiàn)機制);
如果要被代理的對象不是實現(xiàn)類,那么Spring會強制使用CGLib來實現(xiàn)動態(tài)代理。?
配置方式
- XML方式
- 注解方式
- 基于Java類配置
- 通過 @Configuration 和 @Bean 這兩個注解實現(xiàn)的
- @Configuration 作用于類上,相當于一個xml配置文件;
- @Bean 作用于方法上,相當于xml配置中的;
基本概念
- 核心業(yè)務(wù)功能和切面功能分別獨立進行開發(fā) ,然后把切面功能和核心業(yè)務(wù)功能 “編織” 在一起,這就叫AOP
- 讓關(guān)注點代碼與業(yè)務(wù)代碼分離
- 面向切面編程就是指: 對很多功能都有的重復的代碼抽取,再在運行的時候往業(yè)務(wù)方法上動態(tài)植入“切面類代碼”。
- 應(yīng)用場景:日志,事務(wù)管理,權(quán)限控制
事務(wù)管理
基本概念
- 如果需要某一組操作具有原子性,就用注解的方式開啟事務(wù),按照給定的事務(wù)規(guī)則來執(zhí)行提交或者回滾操作
- 事務(wù)管理一般在Service層
事務(wù)控制
- 編程式事務(wù)控制
- 用戶通過代碼的形式手動控制事務(wù)
- Conn.setAutoCommite(false); // 設(shè)置手動控制事務(wù)
- 粒度較細,比較靈活,但開發(fā)起來比較繁瑣: 每次都要開啟、提交、回滾
- 聲明式事務(wù)控制
事務(wù)屬性
- 事務(wù)傳播行為
- required_new
- 如果當前方法有事務(wù)了,當前方法事務(wù)會掛起,在為加入的方法開啟一個新的事務(wù),直到新的事務(wù)執(zhí)行完、當前方法的事務(wù)才開始
- required(默認方法)
- 如果當前方法已經(jīng)有事務(wù)了,加入當前方法事務(wù)
- 其余五種方式(拓展學習)
- 事務(wù)傳播行為用來描述由某一個事務(wù)傳播行為修飾的方法被嵌套進另一個方法的時候事務(wù)如何傳播。
- 數(shù)據(jù)庫隔離級別
- TransactionDefinition.ISOLATION_DEFAULT: 使用后端數(shù)據(jù)庫默認的隔離級別,Mysql 默認采用的 REPEATABLE_READ隔離級別 Oracle 默認采用的 READ_COMMITTED隔離級別.
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級別,允許讀取尚未提交的數(shù)據(jù)變更,可能會導致臟讀、幻讀或不可重復讀
- TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生
- TransactionDefinition.ISOLATION_REPEATABLE_READ: 對同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生。
- TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級別,完全服從ACID的隔離級別。所有的事務(wù)依次逐個執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
- 事務(wù)超時屬性
- 指一個事務(wù)所允許執(zhí)行的最長時間,如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。
- 事務(wù)只讀屬性
- 回滾規(guī)則
- 定義了哪些異常會導致事務(wù)回滾而哪些不會。默認情況下,事務(wù)只有遇到運行期異常時才會回滾,而在遇到檢查型異常時不會回滾,也可以用用戶自己定義
Spring事務(wù)管理接口
- PlatformTransactionManager
- (平臺)事務(wù)管理器
- Spring并不直接管理事務(wù),而是提供了多種事務(wù)管理器,通過PlatformTransactionManager這個接口,Spring為各個平臺如JDBC、Hibernate等都提供了對應(yīng)的事務(wù)管理器,但是具體的實現(xiàn)就是各個平臺自己的事情了。
- TransactionDefinition
- 事務(wù)定義屬性(事務(wù)隔離級別、傳播行為、超時、只讀、回滾規(guī)則)
- TransactionStatus
事務(wù)管理一般在Service層
- 如果在dao層,回滾的時候只能回滾到當前方法,但一般我們的service層的方法都是由很多dao層的方法組成的
- 如果在dao層,commit的次數(shù)會過多
IOC
依賴注入
- 注解
- 自動掃描(component-scan)
- 裝配規(guī)則- 基于XML配置的顯式裝配
- 基于Java配置的顯式裝配
- 構(gòu)造器依賴注入通過容器觸發(fā)一個類的構(gòu)造器來實現(xiàn)的,該類有一系列參數(shù),每個參數(shù)代表一個對其他類的依賴。
- setter方法注入
- 例如:
- 之所以叫setter方法注入,因為這是通過找到類的對應(yīng)的setter方法,再進行相應(yīng)的注入
- Setter方法注入是容器通過調(diào)用無參構(gòu)造器或無參static工廠 方法實例化bean之后,調(diào)用該bean的setter方法,即實現(xiàn)了基于setter的依賴注入。
- 最好的解決方案是用構(gòu)造器參數(shù)實現(xiàn)強制依賴,setter方法實現(xiàn)可選依賴。
- 循環(huán)依賴
- 構(gòu)造器方式無法解決,只能拋出異常
- 多例方式無法解決,只能拋出異常
- 因為Spring容器不緩存"prototype"作用域的bean,因此無法提前暴露一個創(chuàng)建中的bean。?
- 單例模式可以解決
- 通過提前暴露一個單例工廠方法,從而使其他bean能夠引用到該bean/提前暴露一個正在創(chuàng)建中的bean
- 不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建,不在代碼里直接組裝組件和服務(wù),但是要在配置文件里描述哪些組件需要哪些服務(wù),之后一個容器(IOC容器)負責把他們組裝起來。
容器的初始化過程
- 1.)Resource定位;指對BeanDefinition的資源定位過程。通俗地講,就是找到定義Javabean信息的XML文件,并將其封裝成Resource對象。
- 2.)BeanDefinition的載入;把用戶定義好的Javabean表示為IoC容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu),這個容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu)就是BeanDefinition。
- 3.)向IoC容器注冊這些BeanDefinition。
bean知識
- bean的生命周期
- 1.實例化Bean
- 2.設(shè)置Bean的屬性
- 3.檢查Aware相關(guān)接口并設(shè)置相關(guān)依賴
- BeanNameAware
- BeanFactoryAware
- ApplicationContextAware
- 4.檢查BeanPostProcessor接口并進行前置處理
- 5.檢查Bean在Spring配置文件中配置的init-method屬性并自動調(diào)用其配置的初始化方法。
- 由于這個是在Bean初始化結(jié)束時調(diào)用那個的方法,也可以被應(yīng)用于內(nèi)存或緩存技術(shù);
- 6.檢查BeanPostProcessor接口并進行后置處理
- 7.當Bean不再需要時,會經(jīng)過清理階段,如果Bean實現(xiàn)了DisposableBean這個接口,會調(diào)用那個其實現(xiàn)的destroy()方法;
- 最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調(diào)用其配置的銷毀方法。
- bean的作用域
- singleton
- Spring IoC容器中只會存在一個共享的Bean實例,無論有多少個Bean引用它,始終指向同一對象。
- singleton是Bean的默認作用域
- 默認情況下是容器初始化的時候創(chuàng)建,但也可設(shè)定運行時再初始化bean
- DefaultSingletonBeanRegistry類里的singletonObjects哈希表保存了單例對象。
- Spring容器可以管理singleton作用域下bean的生命周期,在此作用域下,Spring能夠精確地知道bean何時被創(chuàng)建,何時初始化完成,以及何時被銷毀
- prototype
- 每次通過Spring容器獲取prototype定義的bean時,容器都將創(chuàng)建一個新的Bean實例,每個Bean實例都有自己的屬性和狀態(tài)
- 當容器創(chuàng)建了bean的實例后,bean的實例就交給了客戶端的代碼管理,Spring容器將不再跟蹤其生命周期,并且不會管理那些被配置成prototype作用域的bean的生命周期。
- 對有狀態(tài)的bean使用prototype作用域,而對無狀態(tài)的bean使用singleton作用域。
- request
- 在一次Http請求中,容器會返回該Bean的同一實例。而對不同的Http請求則會產(chǎn)生新的Bean,而且該bean僅在當前Http Request內(nèi)有效。
- session
- 在一次Http Session中,容器會返回該Bean的同一實例。而對不同的Session請求則會創(chuàng)建新的實例,該bean實例僅在當前Session內(nèi)有效。
- global Session
- 在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。
- bean的創(chuàng)建
- 1.進入getBean()方法
- 2.判斷當前bean的作用域是否是單例,如果是,則去對應(yīng)緩存中查找,沒有查找到的話則新建實例并保存。如果不是單例,則直接新建實例(createBeanInstance)
- 3.新建實例后再將注入屬性(populateBean),并處理回調(diào)
- 創(chuàng)建bean
- 找到@Autowired的對象
- 創(chuàng)建注入對象,并賦值
大致流程
- 1.首先根據(jù)配置文件找到對應(yīng)的包,讀取包中的類,,找到所有含有@bean,@service等注解的類,利用反射解析它們,包括解析構(gòu)造器,方法,屬性等等,然后封裝成各種信息類放到container(其實是一個map)里(ioc容器初始化)
- 2.獲取類時,首先從container中查找是否有這個類,如果沒有,則報錯,如果有,則通過構(gòu)造器信息將這個類new出來
- 3.如果這個類含有其他需要注入的屬性,則進行依賴注入,如果有則還是從container找對應(yīng)的解析類,new出對象,并通過之前解析出來的信息類找到setter方法(setter方法注入),然后用該方法注入對象(這就是依賴注入)。如果其中有一個類container里沒找到,則拋出異常
- 4.如果有嵌套bean的情況,則通過遞歸解析
- 5.如果bean的scope是singleton,則會重用這個bean不再重新創(chuàng)建,將這個bean放到一個map里,每次用都先從這個map里面找。如果scope是session,則該bean會放到session里面。
- 總結(jié):通過解析 xml 文件,獲取到bean的屬性(id,name,class,scope,屬性等等)里面的內(nèi)容,利用反射原理創(chuàng)建配置文件里類的實例對象,存入到 Spring 的 bean 容器中
SpringMVC
執(zhí)行流程
- 1、 用戶發(fā)送請求至前端控制器DispatcherServlet
- 2、 DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器。
- 3、 處理器映射器根據(jù)請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
- 4、 DispatcherServlet通過HandlerAdapter處理器適配器調(diào)用處理器
- 5、 執(zhí)行處理器(Controller,也叫后端控制器)。
- 6、 Controller執(zhí)行完成返回ModelAndView
- 7、 HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet
- 8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- 9、 ViewReslover解析后返回具體View
- 10、DispatcherServlet對View進行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
- 11、DispatcherServlet響應(yīng)用戶
注解
servlet生命周期
- 1.加載和實例化
- 2.初始化
- 3.請求處理
- 4.服務(wù)終止
Spring類
ApplicationContext
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- WebXmlApplicationContext
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
分享名稱:Spring關(guān)鍵知識點-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://sd-ha.com/article8/jjpip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、網(wǎng)站維護、定制開發(fā)、全網(wǎng)營銷推廣、域名注冊、軟件開發(fā)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源:
創(chuàng)新互聯(lián)