Spring Framework系統架構
核心容器的學習
IOC/DI
IOC容器
IOC
????????使用對象時,由主動new產生的對象轉換為由外部提供對象,此過程中對象的創建的控制權交由外部,此思想稱為控制反轉,? ?(實現了自己new的解耦)? 對象創建的控制權
Spring提供一個容器,稱為IOC容器 用來充當IOC思想的外部
Bean
IOC容器負責對象創建,初始化,等一系列的操作,被創建或被管理的對象在IOC容器中統稱為Bean
DI
在容器中建立bean與bean之間的依賴關系的整個過程,稱為依賴注入
核心概念? :
充分解耦? ?使用IOC管理bean? 使用DI依賴注入進行綁定
最終效果? :使用對象時不僅可以從IOC中直接獲取,并且獲取到的Bean已經綁定了所有的依賴關系
?IOC入門
管理什么---------------service與dao
如何將被管理的對象告知IOC容器? -------------配置
被管理的對象交由IOC容器,如何獲取到IOC容器-----------接口
如何從容器中獲取bean-----------接口方法
使用Spring獲取到----------pom.xml
DI入門
?如何將Dao對象進入到Service中 (提供set方法)
Servic與Dao的關系如何描述? (配置)
bean配置
單例模式,(默認)? 多例
為什么用單例?? scope? si? ??
不適合的給容器管理的bean封裝實體的域對象
name可以配置多個名字
bean的實例化
實例化的三中的方式
1使用構造方法
調用的是無參的構造方法 構造方法的不管是公共的還是私有的都能調用,反射
技巧:? ?Spring的報錯觀察最下面
2-----靜態工廠的實例化? ?
工廠的創建對象的方法是靜態的? 直接寫到里面
配置上class = factory 然后后面添加工廠的方法的
為什么不直接new對象? ? ? ? ?原因可以在工廠中對 對象的功能的增強
3實例工廠初始化bean?
工廠的創建bean的方法是非靜態的 所以先要創建工廠對象,然后通過工廠對象創建bean
? 為什么創建一個無用的工廠bean累贅
改良---------? 使用FactoryBean實例化? ? ? ? ?<實用>
Bean的聲明周期
從創建到銷毀的整個過程
初始化容器,
創建對象
執行構造方法
執行屬性注入set操作
執行bean的初始化方法
使用bean
執行業務操作
關閉銷毀容器
執行bean的銷毀
依賴注入的方式-----DI
?注入的類型? ------------基本類型,引用類型
自動裝配
???????IOC容器根據bean所依賴的資源在容器中自動查找并注入到bean中的過程叫做自動裝配
自動裝配的方式
1 按照類型
2 按照名稱
3 構造方法注入
4 不啟動自動裝配
在service要想自動裝配dao要使用setter方法,然以配置中使用bytype
按照類型匹配必須要求類型唯一
按照名稱裝配? ?id和set方法后面的一致? ?要求名稱必須一致? ?變量名與配置耦合,不推薦
自動裝配用于引用類型的操作,不用于簡單類型的進行操作,
自動裝配的優先級低于setter方法和構造方法注入,同時出現會失效
數據源對象管理? ?第三方bean的管理
對象交由我們管理,將對應的屬性提供過去,(set方法注入)
容器
1 ,加載類路徑下的配置文件 -------------獲取容器
2,?獲取bean??
BeanFactory接口最頂層的接口? 最早期的容器接口
beanFactory的操作
兩者的區別
beanfactory加載是延遲加載? ? ?application初始化的bean是立即加載的
注解
?bean的作用范圍? bean生命周期
單例加@scope? ? prototype? ? ? Singleton
bean的聲明周期
初始化方法:-----(在構造方法之后運行) 在方法上加@PostConstruct
bean銷毀之前------@PreDestroy
bean銷毀之前的操作記得? 關閉容器和關閉鉤子才能運行
?依賴注入----------自動裝配? ? ? ?
引用類型
?@Autowired? ? ? ? ?
原理按照類型裝配??
若是有多個相同類型的bean使用@Qualifier指定名稱? ?(需要依賴@Aut? 一起用)
?注意:自動裝配基于反射設計創建對象并暴力反射對應的私有屬性初始化的數據,因此無需提供setter方法
自動裝配記得提供無參的構造方法,(不提供造不出對象)
簡單類型
@Value
加載外部的prop文件? 配置的文件加載到bean中使用
1 寫配置文件
2 配置文件上加注解? ?propertySource(文件地址)? ----------不支持通配符*
3 使用
第三方bean的管理?
@Bean 添加這個表示方法的返回值是bean
?返回值就是所需要的bean
不建議直接 寫入Springconfig中
新創建一個Config類然后導入SpringConfig配置中
?如果配置類中缺少東西? 如簡單類型? ?引用類型
簡單類型
Springconfig 配置文件上寫???propertySource加載這個簡單類型的數據文件地址 然后在用的地方直接@value
引用類型
假定需要使用dao? ? ?給個類型,Spring直接給你
原理自動裝配? ?在容器中給你找這個bean給你自動裝配進去? (按照類型裝配)
注解和xml配置比較
注意? :? bean定義完在再文件中,注解Component需要我們識別出來,掃描bean的包
Spring整合Mybatis
運行類
配置類
?核心對象SqlSessionFactory??
mybatis管理的就是sqsessionFactory對象
第三方bean的管理? ?
記得Springconfig 導入該配置
?創建sqlsessionFacoryBean
?AOP
面向切面編程
不驚動原始設計的基礎上為其進行功能的增強
無侵入式/無入侵式? ? 編程
紅色的是業務代碼
將藍色的代碼抽取出來,??
連接點 原始方法
切入點 實際追加功能的方法
通知? 共性的功能
切面? 通知這個共性的功能與切入點之間的關系? ? ?(在哪個切入點上執行那些通知)
連接點是所有方法,切入點是匹配某些方法,有了切入點有了通知將他們一綁定叫做切面
切面描述的就是共性功能與執行位置之間的關系
入門案例
?
?
?AOP的工作流程
????????如果切入點和要造bean的那個類匹配上對應的方法,那么就造代理對象否則就是原始對象
? ? ? ? 工作本質:代理模式
?Aop切入點表達式
描述切入點方法的表達式
execution執行到指定的切入點?
?
?通知類型
前置通知? ? ? @Before
????????設置當前通知方法與切入點之間的綁定關系,當前通知方法在原始切入點方法前運行
后置通知? ? ? ? @After
????????設置當前通知方法與切入點之間的綁定關系,當前通知方法在原始切入點方法后運行
環繞通知
????????設置當前通知方法與切入點之間的綁定關系,當前通知方法在原始切入點方法前后運行
?????????通過proceedingjoinpoint來調用原始方法,如果沒有調用原始方法,就會對原始方法進行一個隔離的操作? ?比如說權限驗證的操作,如果 沒有權限,就不會調用原始方法,
返回后通知? @AfterReturning
????????設置當前通知方法與切入點之間的綁定關系,當前通知方法在原始切入點方法正常執行完畢后運行? ? ? (方法沒有拋出異常才能通知)
拋出異常后通知? ?@AfterThrowing
注意,這個僅僅是方法出異常之后才能執行,不出異常不執行.
案例:測量業務層接口萬次執行效率
?這樣就可以得到每個方法的執行時間,進行改良
主要是通過proceedingjoinpoint獲取到該方法的簽名信息,然后獲取到該方法的接口名,和方法名
就可以描述出來當前測得是誰
注意只是一個理論值
AOP通知獲取數據
獲取參數
獲取返回值
獲取異常信息
? ? ? ? 分析:是不是所有的通知都能拿到這三個,但是返回值和異常信息不一定
獲取參數? ?
????????可以解決的問題,比如說前端傳過來一個對象,但是我要的是字符串,那么aop獲取到參數,檢測到不是字符串,那么就傳遞一個默認的參數,這樣就保證了程序的健壯性.
返回值的獲取
? ? ? ? ? ? ?afertreturning? 和 around
????????案例百度網盤密碼數據兼容處理
????????通過proceedingjoinpoint的getAregs獲取到業務層代碼的參數,然后獲取到,密碼的String,然后通過trim去掉密碼的空格,然后返回到給業務層,然后繼續實現業務層代碼.?????????
如果有許多大量的重復的功能在項目中加載,那么aop是不二選擇,簡化共性開發
?Aop的總結
? ????????
?
其中環繞通知可以模擬出其他所有的通知
只在調用方法前做事情-------前置通知
用trycatch在finally里面寫的東西就是------后置通知
用trycach在try大括號結束之前原始方法調用之后的通知就是-------返回后通知
catch模擬--------拋出異常后通知
Spring的事務
? 解釋:可以在業務層開啟的事務
事務作用:在數據層保障一系列的數據庫操作同成功同失敗
Spring事務的作用:? ?在業務層開啟事務可以保證多個調用數據層的操作同成功或者失敗
如何保證 :平臺事務管理器接口? ?兩個方法? 回滾,提交
實現類使用jdbc的事務?
?
? 案例轉賬:? ? 轉賬整個事務中沒有原子性,要么這個轉賬的事務全做要么全不做
? ? ? ? ?第一步在要加事物的接口上加上@Transaction? 第二步設定平臺事務管理器然后在配置中加上事務管理器,config中加上事務管理器的bean? 創建事務的datasourceTransactionMananger事務管理器, 第三步? 在Spring的配置文件中加上EnableTransactionManageMenagement告訴Spring你加上了Transaction這個事務管理器
當加上了事務的注解的業務層代碼,出現了異常,要么都提交要么都不提交.
第一步
第二步?
第三部
?Spring事務角色
?
?將兩個事務都加到Spring事務中
事務管理員? ? 事務發起方,在Spring中通常指的是業務層開啟事物的方法
事務協調員? ?加入事務方? 在Spring中指的是數據層的方法,也可以是業務層方法
將多個事務打成一個事務
????????mybatis中的sqlSessionFactory中的Datasource和我們的jdbc中的事務管理器中的sqlsessionFactory的datasource是同一個,所以Spring的事務管理才能生效進行統一進行管理
進行相同的數據源進行管理.
事務的相關配置(可以在注解上進行配置)
案例
?
日志事務和兩個轉賬事務都繼承一個事務,但是我們想要的是日志的事務不要加入這個事務的集中,自己開啟一個全新事務?
事務的傳播行為? ?事務協調員對事務管理員的所攜帶事務的處理態度? ? (右邊對左邊)
讓事務的協調員有不同的事務特征
SpringMVC
簡介;? ? ? 是一種基于Java實現的mvc模型的輕量級的web框架
Springmvc進行表現層功能開發
?入門案例?
導入jar包
定義成bean?
?初始化配置類
?告訴tomcat容器加載配置
?流程分析
?
?
?Springboot
?
?