文章目錄
1.spring概述
- 使用pojo進行輕量級和最下侵入性開發
- 通過依賴注入和基於接口編程實現鬆耦合
- 通過aop和默認習慣進行聲明式編程
- 使用aop和模板減少模式化代碼
面向bean,依賴注入以及面向切面三種方式達成的
面向對象和麪向過程: 面向過程代碼複用和代碼管理非常不方便
spring進行對象的初始化和實例化(控制器)
spring自動實現,實例化的先後順序
IOC容器(存的是javabean,也就是spring實例化的bean對象)
實現依賴注入
- @Autowrte A a; //根據類型自動注入
- @Autowrite InterfaceA a;//自動注入它的實現類
- @Resource(“aaa”) A a; //把ioc容器中id爲aaa的對象自動注入(區分父子類)
spring的注入方式
- get/set
- 構造器
- 強制賦值
AOP:
把一個整體,拆掉,分別開發
等到發佈的時候,在組裝到一起運行
其中按照一套相同的規則,這個規則就是切面
AOP的核心思想-解耦
面向切面編程,aop是一種編程思想,允許程序員對橫切關注點或橫切典型的職責分界線的行爲進行模塊化。aop的核心構造是方面(切面),它將那些影響多個類的行爲封裝大可重用的模塊中。是對ioc補充性的技術,運用模塊化方式解決企業應用程序開發中的複雜問題。
aop應用場景:
transction manager事務管理,
logging日誌,
authentication權限認證,
lazy loading懶加載,
context process 上下文處理
error handler 錯誤跟蹤
2.常用的設計模式
2.1 代理模式:
- 靜態代理
- JDK動態代理(實現Invocationhandler接口)
- CGLIB動態代理 cglib.jar(code Generation Library 代碼生成庫)
特點: (關注過程)
1.執行者,被代理者
2.注重過程,被代理者,事情一定要做,自己不想做或沒有時間做,找代理
3.需要獲取被代理人的個人資料
比如:中介,黃牛,媒人,經紀人
總結: 字節碼重組
2.1.1 JDK動態代理原理:
- 拿到被代理對象的引用,然後獲取它的接口
- jdk代理重新生成一個類,同時實現我們給的代理對象所實現的接口
- 把代理對象的引用 也拿到
- 重新動態生成一個class字節碼
- 然後編譯
- jdk動態代理是通過接口來進行強制轉換的,生成以後的代理對象會,可以強制轉換爲接口
2.1.2 cglib動態代理原理:
- CGLIB動態代理是通過生成一個被代理對象的子類,然後重寫父類的方法,生成以後的對象,可以強制轉換爲被代理的對象(也就是自己寫的類)。子類引用賦值給父類
2.1.3 可以做什麼
可以在每一個方法之前加一些代碼,在方法調用之後再加一些代碼
AOP:事務代理,日誌監聽
service方法
開啓一個事務(open)
事務的執行(自己寫的代碼完成的)
監聽到是否有異常(commit/rollback)
事務關閉
2.2工廠模式
- 簡單工廠模式
- 工廠方法
- 抽象工廠(spring中用的最多)
2.2.1 特點
隱藏複雜的邏輯過程,關只心結果
2.2.2 spring中的工廠模式
生產bean的
- 單例bean
- 被代理的bean
- 原始bean(原型)
- list類型的bean
- 作用域不同的bean
getBean()
不用工廠模式,,代碼非常紊亂,並且維護困難
解耦(鬆耦合開發)
2.3 單例模式
2.3.1 特點
- 保證從系統啓動到系統停止,全過程只會產生一個實例(是什麼)
- 當我們在應用中遇到功能性衝突的時候,需要使用單例模式(爲什麼)
2.4 委派模式(delegate)
最大特點:不關心過程,,只關心結果
- 類似於中介的功能(委託機制)
- 只有被委託人的引用
- 一定要和代理模式區分開來
-
兩個角色,受託人,委託人(社會上平等關係)
公司裏面: 項目經理,普通員工(各自職責不同)
項目經理:職責安排任務
普通+員工:執行任務 -
目的:隱藏具體的實現邏輯
-
IOC容器中,有一個Register(爲了告訴我們的容器,這個類被初始化過程中,需要很多不同的邏輯處理,需要實現多個任務執行者,分別實現各自的功能)
保證結果的多樣性,對於用戶來說只有一個方法。
2.5 策略模式:
例如:一個人 從A–>B,可以有好幾種路線,但是起點和終點是一樣的(最終結果是一樣的)
Java中的具體:list集合的比較器的不同的實現方式,,具體的比較邏輯可能不一樣,但是返回的都是一樣的 0,>0,<0
2.6 原型模式:
Java具體實現:克隆
ORM經常用到
2.6.1 場景
有一個現成的對象,這個對象裏面有現成的值
新建對象,要賦值,賦值內容和之前的一模一樣
一個一個get/set循環 會很複雜,反射(性能低),因此考慮使用原型模式(clone字節碼複製)
- 能夠直接拷貝其實際內容的只支持九種(八大基本數據類型+string)淺拷貝
- 克隆不走構造方法
2.7 模板模式(template)
執行流程一樣:但中間有些步驟不同;
2.7.1 場景
喝茶和和喝咖啡(奶茶)步驟:
- 準備開水
- 杯子,原料放在杯子中(不同的原料)
- 用水沖泡
- 添加輔料(輔料可能不同)
這寫步驟可以寫成一個固定的模式,即爲一個模板
- springJDBC Java有一個規範,各個數據庫廠商實現
- 加載數據庫驅動 DriverManager
- 建立連接
- 創建語句集(標準語句集,預處理語句集)
- 執行語句集
- 結果集ResultSet