在介紹spring一些常見基本概念解析之前,要先對Spring框架做一個基本的認識菊匿。
Spring是一款開源的輕量級JAVA SE/JAVA EE開發(fā)應用框架铅搓,目的是用于簡化企業(yè)級應用框架筐带。
應用程序是由一組相互協(xié)作的對象完成的,在傳統(tǒng)的應用程序開發(fā)中茂装,一個完整的應用是由一組相互協(xié)作的對象組成的,所以在開發(fā)一個應用時怠蹂,除了要開發(fā)業(yè)務邏輯之外,還要關(guān)注如何使用這些對象協(xié)作來完成所需的功能少态,而且要高內(nèi)聚城侧、低耦合。
Spring剛出來的時候就是幫我們解決創(chuàng)建對象和管理對象的依賴關(guān)系况增,還提供通用日志記錄赞庶、性能統(tǒng)計、安全控制澳骤、異常處理等面向切面的能力歧强,還能管理數(shù)據(jù)庫事務,本身也提供了簡單的JDBC實現(xiàn)为肮,提供與第三方框架的集成摊册,與各種JAVA EE 技術(shù)整合,還有自己的web層 Spring MVC框架颊艳。
設(shè)計的初衷
最開始Spring是為了解決企業(yè)級應用開發(fā)的復雜性設(shè)計的茅特,可以簡化開發(fā),為了撅起EJB那種復雜的開發(fā)棋枕。
采取了四種關(guān)鍵策略:
1.基于POJO的輕量級和最小侵入式編程白修。
2.通過依賴注入和面向接口松耦合。
3.通過切面和慣性進行聲明式編程重斑。
4.通過切面和模板減少樣板式代碼兵睛。
而他主要是通過:面向Bean、依賴注入以及面向切面這三種方式來達成的窥浪。
IOC與IOC容器
大家都知道這是 控制反轉(zhuǎn)祖很。 那么我們可以思考下,他反轉(zhuǎn)的是什么呢漾脂?控制什么呢假颇? 一般來說,我們對象的創(chuàng)建都是由客戶端主動創(chuàng)建的來控制的骨稿。在使用了spring之后笨鸡,所有的Bean都會由Spring來創(chuàng)建。
所以叫做控制對象的創(chuàng)建進行反轉(zhuǎn)啊终,由應用程序來創(chuàng)建镜豹,然后new出來以后需要統(tǒng)一管理起來,所以有了IOC容器容器(ConcurentHashMap)來管理蓝牲。
OOP
這個不能算spring的專業(yè)術(shù)語趟脂,他是面向?qū)ο缶幊痰囊馑肌>邆淙筇匦裕悍庋b例衍、繼承昔期、多態(tài)已卸。萬物都是對象,面向?qū)ο缶幊膛鹨唬P(guān)注事物之間的聯(lián)系累澡,而不是行為的實現(xiàn)過程。
BOP:
簡單來說般贼,就是面向Bean進行編程愧哟。 Bean與Bean之間的關(guān)系,不希望每次都認為去管理哼蛆,而是由程序去管理蕊梧。spring就是從Bean的管理開始的。Bean在Spring中作用就像Object對OOP的意義一樣腮介,Spring中沒有Bean也就沒有Spring存在的意義肥矢。Spring提供了IOC容器通過配置文件或者注解的方式來管理對象之間的依賴關(guān)系。
DI技術(shù)
字面翻譯就是動態(tài)注入的意思叠洗。 通俗就是動態(tài)對象賦值甘改,動態(tài)的調(diào)用getter、setter(采用反射的方式)灭抑,他是控制反轉(zhuǎn)實現(xiàn)的一種方式十艾,也叫做依賴注入。
Spring的加載步驟:定位腾节、載入疟羹、注冊、再確定要不要初始化Spring禀倔。
依賴注入的基本概念
Spring設(shè)計的核心 org.springframework.beans包(架構(gòu)核心是 org.springframework.core包),它的設(shè)計目標是與 JavaBean組件一起使用参淫。這個包通常不是由用戶直接使用救湖,而是由服務器將其用作其他多個功能的底層中介。
下一個最高級抽象是 BeanFactory接口涎才,它是工廠設(shè)計模式的實現(xiàn)鞋既,允許通過名稱創(chuàng)建和檢索對象。BeanFactory也可以管理對象之間的關(guān)系耍铜。
BeanFactory 支持兩種對象模型邑闺。
1,單例:模型提供了具有特定名稱的對象的共享實例棕兼,可以在查詢時對其進行檢索陡舅。Singleton 是默認的也是最常用的對象模型。對于無狀態(tài)服務對象很理想伴挚。
2靶衍,原型:模型確保每次檢索都會創(chuàng)建單獨的對象灾炭。在每個用戶都需要自己的對象時,原型模型最適合颅眶。
Bean工廠的概念是 Spring作為IOC容器的基礎(chǔ)蜈出。
AOP面向切面編程
很多人都說不清楚這個概念,只會說這是面向切面編程涛酗,這個根據(jù)你深入的使用和理解才能深入淺出的解釋出來铡原。這是一種編程思想,它允許程序員對橫切關(guān)注點或橫切典型的職責分界線的行為(例如日志和事務管理)進行模塊化商叹。AOP的核心構(gòu)造是方面(切面)燕刻,它將那些影響多個類的行為封裝到可重用的模塊中。
在典型的面向?qū)ο箝_發(fā)方式中沈自,可能要將日志記錄放在所有方法和java類中酌儒,才能實現(xiàn)日志功能,在AOP方式中枯途,可以反過來將日志服務模塊化忌怎,以聲明的方式將他們應用到日志的組件上。具體使用方式是繼承一個接口去重寫子類的方法酪夷,然后使用添加注解的方式榴啸。
這樣做的優(yōu)勢就是java類不需要知道日志服務的存在,不需要考慮相關(guān)代碼晚岭,所以用AOP編程能夠松耦合鸥印。
spring AOP的功能完全集成到了Spring的事務管理、日志和其他各種特性上下文中坦报。
常用場景有:
Authentication權(quán)限認證库说、Logging日志、Transctions Manager事務片择、Lazy Loading懶加載潜的、Context Process上下文處理、Error Handler錯誤跟蹤字管、Cache緩存等啰挪。
使用AOP主要是能有兩方面的作用:
1.起增強功能。
2.起解耦作用嘲叔,專人干專事亡呵。
總結(jié)起來,就是AOP硫戈,是一種面向切面編程锰什,允許程序員對橫切關(guān)注點的行為(例如日志和事務管理)進行模塊化,核心是切面。典型應用有日志歇由、權(quán)限卵牍、懶加載、事務等功能沦泌。
比如需要對一個業(yè)務服務進行日志記錄糊昙,該服務就是關(guān)注點,切面谢谦,就是一刀下去形成的兩個面释牺,把這兩個面分別關(guān)聯(lián)在關(guān)注點的邊,一邊記錄服務開始執(zhí)行日志回挽,一邊記錄服務成功或失敗原因日志没咙。
再舉個事務管理的實現(xiàn),以下是數(shù)據(jù)庫事務的結(jié)構(gòu)圖千劈,執(zhí)行業(yè)務服務代碼時祭刚,需要開始數(shù)據(jù)庫連接,開啟事務墙牌,然后才執(zhí)行業(yè)務代碼涡驮,在執(zhí)行過程種,若操作失敗了喜滨,則進行事務回滾捉捅,如果成功則提交事務。織入
意思就是字節(jié)碼重組
增強
就是使用動態(tài)代理的方式去對行為進行增強虽风。
通知(滿足條件回調(diào))
通知(Advice) :“切面”對于某個“連接點”所產(chǎn)生的動作棒口。其中,一個“切面”可以包含多個“Advice”辜膝。
切入點(Pointcut) :匹配連接點的斷言无牵,在AOP 中通知和一個切入點表達式關(guān)聯(lián)。切面中的所有通知所關(guān)注的連接點厂抖,都由切入點表達式來決定合敦。能夠滿足切面規(guī)則的所有入口
目標對象(Target Object) :被一個或者多個切面所通知的對象。例如AServcieImpl 和BServiceImpl验游,當然在實際運行時,Spring AOP 采用代理實現(xiàn)保檐,實際AOP 操作是TargetObject的代理對象耕蝉。
AOP 代理(AOP Proxy) :在Spring AOP 中有兩種代理方式,JDK 動態(tài)代理和CGLIB 代理夜只。默認情況下垒在,TargetObject 實現(xiàn)了接口時,則采用JDK 動態(tài)代理扔亥,例如场躯,AServiceImpl谈为;反之,采用CGLIB代理踢关,例如伞鲫,BServiceImpl。強制使用CGLIB 代理需要將<aop:config>的proxy-target-class屬性設(shè)為true签舞。
通知(Advice)類型:
前置通知(Before advice):在某連接點(JoinPoint)之前執(zhí)行的通知秕脓,但這個通知不能阻止連接點前的執(zhí)行。ApplicationContext 中在<aop:aspect>里面使用<aop:before>元素進行聲明儒搭。例如吠架,TestAspect 中的doBefore 方法。
后置通知(After advice):當某連接點退出的時候執(zhí)行的通知(不論是正常返回還是異常退出)搂鲫。ApplicationContext 中在<aop:aspect>里面使用<aop:after>元素進行聲明傍药。例如,ServiceAspect中的returnAfter 方法魂仍,所以Teser 中調(diào)用UserService.delete 拋出異常時拐辽,returnAfter 方法仍然執(zhí)行。
返回后通知(After return advice):在某連接點正常完成后執(zhí)行的通知蓄诽,不包括拋出異常的情況薛训。ApplicationContext 中在<aop:aspect>里面使用<after-returning>元素進行聲明。
環(huán)繞通知(Around advice):包圍一個連接點的通知仑氛,類似Web 中Servlet 規(guī)范中的Filter 的doFilter 方法乙埃。可以在方法的調(diào)用前后完成自定義的行為锯岖,也可以選擇不執(zhí)行介袜。ApplicationContext中在<aop:aspect>里面使用<aop:around>元素進行聲明。例如出吹,ServiceAspect 中的around 方法遇伞。
拋出異常后通知(After throwing advice):在方法拋出異常退出時執(zhí)行的通知。ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素進行聲明捶牢。例如鸠珠,ServiceAspect 中的returnThrow 方法。注:可以將多個通知應用到一個目標對象上秋麸,即可以將多個切面織入到同一目標對象渐排。
使用Spring AOP 可以基于兩種式,一種是比較方便和強大的注解方式灸蟆,另一種則是中規(guī)中矩的xml配置方式驯耻。
AOP,切面,使用注解的方式可缚,比xml更加精準霎迫,可以定位到方法中具體的參數(shù)。