1. 程式人生 > >spring框架在開發中為我們做了哪些事?

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就需要寫一個代理類,增加了程式設計師的程式碼負擔,所以聰明的程式設計師們引入了動態代理。

何為動態代理?我們可以提供這樣的一個思路---程式設計師只需提供領域業務的介面以及具體實現service,如果讓程式設計師來手動寫可以寫一個靜態代理來實現業務需求,但是我們現在把這個工作交給第三方程式程式碼來做,智慧的寫出代理類,當呼叫的時候把代理類創建出來執行方法,底層是通過java反射機制來實現的。

那麼第三方的程式是如何來實現的呢?代理如下

JDK動態代理中包含一個類和一個介面:

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介面的子類例項 
從上面大段程式碼裡面我們可以看出動態代理是如何實現的。說完了動態代理我們可以談談aop程式設計了,也就是面向切面的程式設計。

我們通常的程式設計模式是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 10Docker特殊優化

【編者的話】在過去的幾年中,Docker一直是非常受歡迎的容器技術,而原因也很簡單。將基於JVM的應用程式容器化部署,可以為應用程式提供一致的開

開發都用到那些設計模式?用在什麼場合?

所謂設計模式,就是一套被反覆使用的程式碼設計經驗的總結(情境中一個問題經過證實的一個解決方案)。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使人們可以更加簡單方便的複用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者