Spring的基本配置及概念
Spring
概念:開源的框架 一站式的 貫穿表現層業務層持久層 可以無縫的結合他們
核心思想 控制反轉(IOC) 面向切面(AOP)
是一個超級大工廠 (幫助我們例項化類的 不需要我們自己new 只需要宣告例項然後配置即可 )
體系:結構
優點 :
1.方便解耦簡化開發 2.支援aop思想程式設計 3.事務的支援
4.給測試類提供了方便 5.可以無縫的連線其他優秀的框架 整合
具體實現 ioc 控制反轉將建立物件的權利交給第三方容器來管理
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
基本配置(xml)
1.首先匯入相關的包
2.建立介面以及實現類
3.進行xml 配置
class--需要初始化的類的全類名
id ---初始化後的唯一標識
4.初始化Spring容器調研該類的方法
1.初始化Spring容器
2.獲取相應的bean
1.根據ID獲取
2.根據型別獲取
3.根據型別加ID 獲取
這樣一個簡單的 Spring 的環境就配好了
依賴注入 di --建立的bean裡面有什麼屬性以及引數可以這樣注入然後可以進行呼叫 比如說 現在一個建立好的bean 是一個介面 裡面有一個實現類實現了他的介面我們需要通過呼叫這樣就需要把 該實現類注入到初始化的這個bean 裡面 通過 property 標籤進行注入
具體實現
xml配置
申明需要注入的型別:
注意這裡這樣注入的話都需要寫 set get方法
-------------------------------------------------------------------------------------------------------------------------------------------------
bean 的例項化方式 (三種 )
1.通過預設的構造器例項化
2.靜態工廠
1)<bean>
a)class:靜態工廠的全類名 b)factory-method:靜態工廠中的方法 c)id:呼叫工廠方法建立bean的id
3.非靜態工廠
1)先要例項化非靜態工廠
a)<bean> 1)id:非靜態工廠例項的唯一標識 2)class:非靜態工廠的全類名 2)在呼叫工廠的方法 1)<bean> 1)factory-bean:非靜態工廠例項 2)factory-method:非靜態工廠中的方法 2)id:呼叫工廠方法建立bean的id
-----------------------------------------------------------------------------------------------------------------------------------------------
scope 作用域
1)singleton:單列(預設值)
2)prototype:多列(原生) == 下面這兩個在Web環境中才有效 3)request:每次請求建立一個bean 4)session:都個session都建立一個bean
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自動注入 autowire
1)no:關閉自動注入(預設值)
2)byName:根據名稱注入 a)根據被注入的屬性名稱為參考,去容器中,如果有注入,沒有就不注入 3)byType:根據型別注入 a)根據被注入的屬性的型別,去容器中 1)如果找到了 a)只找到了一個就注入 b)找到了多個就丟擲異常 2)如果沒找到就不注入 4)constructor:通過構造器注入 a)定義一個構造器來接受 5)default:按照父節點中的自動注入機制
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
通過註解實現
1.首先開啟包掃描
2.在指定的類上添加註解
註解不需要寫set get 方法了
具體註解的功能;
@Component--指定該類可以被Spring管理
預設生成的bean的id為類名首字母小寫 方便呼叫
當然可以修改通過裡面的value屬性進行重新賦值
@Autowired --自動注入的物件 先按照型別注入如果存在多個型別就按照名稱注入 如果名稱不存在就報錯
@Qualifier 與上面的連用 指定多個型別時指定自動注入的名稱
@Resource 也是自動注入 和上面的 @Autowired 一樣只不過這邊如果存在多個型別的話指定名字時不用註解直接用裡面的name 屬性指定注入的名字即可
@Scope 作用域 放在類的前面
其中每個層都有每個層的宣告
持久層:宣告註解 @Repository
業務層:@service
控制層:@controller
這三個和 @Component一個作業寫上面的增強了可讀性
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
AOP --一種思想
術語 :
連線點 可以進入的點 執行(方法之前,方法之後,方法丟擲異常 )
切點 真正進入的點
目標物件 真實的業務主體
增強 系統服務
織入 將增強新增到目標物件的過程
代理類 將增強新增到目標物件的過程產生的代理類
切面:一個範圍
AOP 的實現:
靜態代理就是一種aop 的實現
簡單來說 aop 首先就是解決了程式碼重複的問題我們一般只關心真實的一個方法而這個方法之前之後我們並不關心 所以我們就可以引入aop思想把方法之前和之後需要執行的方法 抽取出去使用者只需要呼叫代理類就可以完成全部操作了 這樣就簡化了程式碼
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
jdk實現動態代理:
a)寫一個類實現InvocationHandler複寫裡面的方法
b)通過Proxy.newProxyInstance() a)目標物件的類載入 b)目標物件的父類介面 c)InvocationHandler子類
呼叫:
優點 :解決的代理類過多的問題
實現了aop思想
缺點:給所有目標物件的所有方法都增強了 需要採用硬編碼的方式進行判斷
目標物件必須要有介面
-------------------------------------------------------------------------------------------------------------------------------------------------
1.cglib實現動態代理
a)寫一個類實現MethodInterceptor介面 b)通過Enhancer建立代理類 1)設定目標物件 2)設定MethodInterceptor例項 3)建立代理類(子類) 2)原理 a)動態給目標物件建立一個子類(setSuperCalss()) b)在子類中複寫父類中的方法 c)在子類的基礎之上進行攔截 3)優點 a)目標物件不需要介面 4)缺點 a)給目標物件中的所有的方法都加了增強,如果要解決通過硬編碼的方式。 b)目的物件不能用final修飾
呼叫------
----------------------------------------------------------------------------------------------------------------------------
AOP裡面的增強
1)前置通知 . MethodBeforeAdvice
2)後置通知 AfterReturningAdvice
3)環繞通知 MethodInterceptor
4)丟擲異常通知 ThrowsAdvice
呼叫
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
註解實現增強
a)註解 1)@Aspect:代表是一個切面 2)@Before:前置通知 1)value:表示式 2)execution(public * add(..)) 1)public 代表的方法的修飾符,預設public 2)*:代表任意返回型別 3)add:方法名稱 4)..:任意引數 3)@After:後置通知,丟擲異常後也執行 4)@Around:環繞通知 1)需要往下呼叫 2)ProceedingJoinPoint 5)@AfterThrowing:丟擲異常通知 6)@AfterReturning:後置通知,出現異常後不執行 7)@Pointcut:表示式
呼叫-----
---------------------------------------------------------------------------------------------------------------------------------------------------------
通過XML方式實現
切面基於xml實現 1)配置 a)目標物件 b)增強 c)切面 1)注入增強 d)<aop:config>:AOP的配置 1)<aop:aspect> a)ref:執行切面 b)<aop:pointcut> 1)id:表示式唯一標識 2)expression:表示式 c)<aop:after> 1)method:方法名稱 2)pointcut:表示式 3)pointcut-ref:表示式的id 2)呼叫 1)初始化Spring容器 2)獲取目標物件(代理物件jdk)
呼叫-----
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring 裡面實現了對資料庫的操作
jdbcTemplate 父
JdbcDaoSupport 子
先要注入資料來源
-------------------------------------------------------------------------------------------------------------
具體配置實現
獲得資料來源
例項化Dao 層 把資料來源注入到 裡面
測試類
-------------------------------------------------------------------------------------------------------------------------------------------------
XML讀取屬性檔案 key取值
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
事務 :
1)定義介面 a)PlatformTransactionManager:裡面提供了事務提交和回顧操作 1)DataSourceTransactionManager:Spring和jdbc操作提供的一個事務管理 2)HibernateTransactionManager:Spring整合Hiberate提供的一個事務管理器 3)JPATransactionManager:JPA事務管理器 b)TransactionDefinition:事務屬性(事務隔離級別,是否只讀,超時時間等) c)TransactionStatus:事務儲存點
xml配置事務的模板
先配置事務管理器--傳入資料來源 然後配置事務模板物件--傳入事務管理器
半自動化的方式
XML全自動方式
註解方式:
1)用註解實現
a)事務管理器 b)開啟註解驅動 1)transaction-manager:事務管理器 c)@@Transactional 1)可以加到方法也可以加到類上
Spring對事務的支援 a)程式設計式事務管理 1)事務模板 b)宣告式的事務管理 1)通過代理的方式來管理事務 2)利用AOP思想 a)基於xml實現(多) b)基於註解實現
----------------------------------------------------------至於整合下次再說