spring框架在開發中為我們做了哪些事?
開發中利用spring可以減輕程式設計師工作負擔,提高程式碼的複用率,降低程式的耦合性,簡化程式碼易於程式的擴充套件和維護。那麼spring是如何實現這些功能的呢,spring在開發中為我們做了哪些事呢?
1、spring實現了ioc 即控制反轉,將物件的建立的控制權由程式設計師的手動建立轉變為spring容器來幫助我們實現物件的建立。
這麼做有什麼好處呢?
a)程式設計師建立物件變得輕鬆,不需要使用一次物件就建立一次物件,只需在spring配置檔案中編寫物件的bean並且注入物件的屬性。
b)通過對bean的統一管理可以輕鬆實現物件的單例模式、原型模式等
c)由於物件是spring容器建立的,所以類與類的聯絡都要通過spring來聯絡起來,降低了程式程式碼之間的耦合性
2、spring的aop程式設計模式
談到aop 不得不提到動態代理、靜態代理。aop的本質其實就是動態代理。舉個通俗的例子,例如我們去租房子,大部分人都是通過代理來租房的,這樣可以有更多的房源供使用者選擇,如果自己去找房子那麼效率是極其低下的,半天也未必能找到滿意的房子。同理我們程式在執行中也是需要訪問dao類來實現service服務,然而為了讓我們的領域業務不被修改(我們可能會在業務裡面加上日誌,安全,事物處理等方面的程式碼),我們可以寫一個dao代理類來實現領域業務(純粹的業務,不加任何附加方法)的功能並且可以在該dao代理類中新增日誌,安全或者事物的方法來滿足業務需求。這樣就實現了業務分工
何為動態代理?我們可以提供這樣的一個思路---程式設計師只需提供領域業務的介面以及具體實現service,如果讓程式設計師來手動寫可以寫一個靜態代理來實現業務需求,但是我們現在把這個工作交給第三方程式程式碼來做,智慧的寫出代理類,當呼叫的時候把代理類創建出來執行方法,底層是通過java反射機制來實現的。
那麼第三方的程式是如何來實現的呢?代理如下
JDK動態代理中包含一個類和一個介面:
從上面大段程式碼裡面我們可以看出動態代理是如何實現的。說完了動態代理我們可以談談aop程式設計了,也就是面向切面的程式設計。JDK動態代理中包含一個類和一個介面: InvocationHandler介面: public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; } 引數說明: Object proxy:指被代理的物件。 Method method:要呼叫的方法 Object[] args:方法呼叫時所需要的引數 InvocationHandler是代理類呼叫方法的處理程式,把代理類,呼叫的方法,需要的引數傳進來<span style="color:#FF0000;">通過invoke執行被代理物件的方法----這裡就是反射機制的體現 </span> Proxy類: Proxy類是專門完成代理的操作類,可以通過此類為一個或多個介面動態地生成實現類,此類提供瞭如下的操作方法: public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException 引數說明: ClassLoader loader:類載入器 Class<?>[] interfaces:得到全部的介面 InvocationHandler h:得到InvocationHandler介面的子類例項
我們通常的程式設計模式是jsp---action---service---dao,通過這樣的模式我們可以把領域業務寫的非常的純粹,但是通常我們需要滿足的業務是比較複雜的,所以我們需要在純粹的領域業務中加入一些公共業務(日誌等),比如對service新增業務,我們可以形象的理解為把service切開,往service某個方法前後新增日誌業務這樣業務實際執行的流程就變為jsp---action---代理service---dao,我們稱這樣橫切新增業務程式碼模組的方式稱為aop程式設計。使用aop程式設計,可以實現業務分工,提高程式碼的複用性,簡化程式碼,使程式設計師的精力集中在業務的實現上,而不是重複的寫相同程式碼。
總結:其實spring很簡單,就為我們做了兩件事第一件是控制反轉,第二件是aop切入式程式設計。後者是不依賴於spring的你可以選擇不使用。
ps:其實spring還是依賴注入的(di)即建立物件的屬性是通過beans.xl注入來實現的,可以歸類為ioc控制反轉。
相關推薦
spring框架在開發中為我們做了哪些事?
開發中利用spring可以減輕程式設計師工作負擔,提高程式碼的複用率,降低程式的耦合性,簡化程式碼易於程式的擴充套件和維護。那麼spring是如何實現這些功能的呢,spring在開發中為我們做了哪些事呢? 1、spring實現了ioc 即控制反轉,將物件的建立的控制權由程式
spring-mvc幫我們做了哪些事
hibernate使用起來,也不太方便;hibernate想要返回的結果是物件,需要將使用到的每一個類的路徑寫到hibernate配置下,而spring只需要在配置檔案中寫下掃描包的路徑;往底層說,hibernate偷懶了,其實只需要遍歷下某個路徑下的所有檔案,便能拿到類名; 使用sessionFactor
Java的封裝到底為我們做了什麼?
1.把物件的狀態和行為看成一個統一的整體,將二則存放到一個類中,該類即可以看作位封裝 2.“資訊贏藏”:對外界不需要知道的當前的內部資訊,只需要知道有一個方式可以獲取或修改當前的資訊,資訊(屬性)的封裝 3.程式碼的實現無需知曉,知道通過當前的方法名即可呼叫或執行完需求,方法的封裝就是對外界
Spring容器初始化過程都做了哪些事兒
1.ClassPathXmlApplicationContext為入口構造方法中有個refresh()方法用來初始化Spring refresh執行的大致流程: Configurab
檢視springboot在啟動的時候為我們注入了哪些bean
在程式入口加入: @SpringBootApplication public class SpringbootFirstApplication { public static void main(String[] args) { SpringApp
ARC到底幫我們做了哪些工作?
關於ARC 從iOS5開始, 就支援自動引用計數(Automatic Reference Counting, ARC)了, 所以就變得更為簡單了。ARC幾乎把所有記憶體管理事宜都交由編譯器來決定, 開發者只需專注於業務邏輯。 關於ARC的一些看法 1.
大數據時代的到來,為我們提供了哪些便利之處?
變革 mage 最大的 研究 智能 快速 針對 images 機制 以前還沒有進入大數據時,社會發展相對比較慢,比如工作生活,交通出行,互聯網並沒有那麽的便利,大家都是各顧各的,進入了大數據時代,大家開始相互分享資源,抱團取暖。下面來說說大數據時代的到來,為我們提供了哪些便
你做了哪些事,導致老闆下調了對你的評價?
創業有些時間了,想寫一下從老闆的角度看員工,更注重哪些點,現在回想自己打工時,做的好些事堪稱二逼+低智,但當時覺得無比正確, 熟不知,你的某些行為讓老闆很不喜歡,有多少人跟我當時一樣,too young too simple. 還在構思+整理,此文集起10個贊,10條評論,就動筆哈。 不好意
在對Activity基類的封裝中,我做了什麽
例如 stream color tin ase throw this reset ack 在開發實踐中,不同Activity有很多代碼是反復冗余的。因此非常有必要將這部分抽取出來。封裝一個繼承自Activity的類,命名為BaseActivity。 翻看之前寫過的代碼
Uboot 中make menuconfig 做了什麽?
tcc err tput 說明 做的 utm image kcon 方法 Make menuconfig 到底做了什麽? (寫在前面: 本文是本人分析uboot中的makefile文件得到的粗淺的見解,寫的越多越感覺其中的深奧復雜。本文是編輯在word中粘貼過來的, 排版
Spring Boot開發中的常用註解的介紹
一、簡言 在spring boot的開發中常常會用到註解 @RequestParam、@PathVariable、@RequestBody、@PageableDefault、@RequestMapping、@GetMapping 和 @PostMapping定義提供給前端的介面函式。下面
Koa幫我們做了什麼
整理web渲染思路,與KOA作比較 1.開啟伺服器並監聽埠,註冊監聽事件 // 原生 let http = require('http') const server = http.createServer((req, res) => { // res.setH
Mybatis與Spring整合時做了哪些事情
這篇部落格主要是來分析MyBatis與Spring整合後Spring幫我們做了哪些事情,以及整合後使用MyBatis有什麼變化。 首先來看看整合包下有什麼東西吧。 第一個模組annotation:這裡做了一個註解(MapperScan),用於掃描mapper。以及mappe
三分鐘學會在spring boot 專案中使用RabbitMq做訊息佇列
第一步:在spring boot專案中新增RabbitMq的maven依賴 <dependency> <groupId>org.springframework.boot</groupId>
LCUI框架開發中需注意的JS基本點
常用方法 this和self this不被上一級呼叫時指向window,被上一級呼叫時指向上一級,被多個物件呼叫時也指向上一級,即this永遠指向最後呼叫它的物件;new可以改變this的指向(建立例項),this遇到return時根據返回物件決定。 self指視窗本身,它
[Vue CLI 3] 外掛開發之 registerCommand 到底做了什麼
首先,我們看到在 package.json 中有 scripts 的定義: "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint"} 我們
[Vue CLI 3] 插件開發之 registerCommand 到底做了什麽
最終 comm 調用 plugin run {} uil 命令 https 首先,我們看到在 package.json 中有 scripts 的定義: "scripts": { "serve": "vue-cli-service serve", "build": "vu
敏捷開發中QA如何做質量管理?
敏捷開發中QA如何做質量管理? 經常有人會問我,敏捷模式下,QA的職責是什麼?QA有什麼價值?我們還需要QA嗎?敏捷轉型中遇到的問題,QA能幫助解決嗎?這些問題以前也思考過,筆者就是QA出
Docker面對Java將不再尷尬:Java 10為Docker做了特殊優化
【編者的話】在過去的幾年中,Docker一直是非常受歡迎的容器技術,而原因也很簡單。將基於JVM的應用程式容器化部署,可以為應用程式提供一致的開
開發中都用到了那些設計模式?用在什麼場合?
所謂設計模式,就是一套被反覆使用的程式碼設計經驗的總結(情境中一個問題經過證實的一個解決方案)。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使人們可以更加簡單方便的複用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者