Spring專題1:一些術(shù)語

-Spring

Spring是一個開放源代碼的設(shè)計層面框架,他解決的是業(yè)務(wù)邏輯層和其他各層的松耦合問題,因此它將面向接口的編程思想貫穿整個系統(tǒng)應(yīng)用。Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架,由Rod Johnson創(chuàng)建。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

spring框架的一些特征:

  • 輕量,從大小與開銷兩方面而言spring都是輕量的。完整的spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布

  • 控制反轉(zhuǎn),spring通過一種稱作控制反轉(zhuǎn)IOC的技術(shù)促進(jìn)了低耦合

  • 面向切面,spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)(例如審計(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)

  • 容器,spring包含并管理應(yīng)用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創(chuàng)建

  • 框架,spring可以將簡單的組件配置、組合成為復(fù)雜的應(yīng)用。在spring中,應(yīng)用對象被聲明式地組合,典型地是在一個xml文件里

  • MVC,Spring的作用是整合,但不僅僅限于整合,Spring 框架可以被看做是一個企業(yè)解決方案級別的框架。客戶端發(fā)送請求,服務(wù)器控制器(由DispatcherServlet實現(xiàn)的)完成請求的轉(zhuǎn)發(fā),控制器調(diào)用一個用于映射的類HandlerMapping,該類用于將請求映射到對應(yīng)的處理器來處理請求。HandlerMapping 將請求映射到對應(yīng)的處理器Controller(相當(dāng)于Action)在Spring 當(dāng)中如果寫一些處理器組件,一般實現(xiàn)Controller 接口,在Controller 中就可以調(diào)用一些Service 或DAO 來進(jìn)行數(shù)據(jù)操作 ModelAndView 用于存放從DAO 中取出的數(shù)據(jù),還可以存放響應(yīng)視圖的一些數(shù)據(jù)。 如果想將處理結(jié)果返回給用戶,那么在Spring 框架中還提供一個視圖組件ViewResolver,該組件根據(jù)Controller 返回的標(biāo)示,找到對應(yīng)的視圖,將響應(yīng)response 返回給用戶

所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持

-spring注解

常用注解,參考文章,請點擊我。

-AOP

AOP相關(guān)知識,參考文章來源地址

AOP(Aspect Oriented Programming,面向切面編程),將程序運行過程分解為一個個的切面,對特定的切面(某個步驟或者階段)進(jìn)行提取,達(dá)到解耦各種不同邏輯代碼。

OOP(Object Oriented Programming,面向?qū)ο缶幊?,通過封裝、繼承將程序抽象為各個層次的對象,進(jìn)而組合為模塊或者程序,達(dá)到了軟件工程中的重用性、靈活性、擴(kuò)展性。程序的運行籠統(tǒng)地可以看為各層次對象之間的相互調(diào)用

AOP相關(guān)的關(guān)鍵字

  • Aspect(切面),程序運行過程中的某個的步驟或者階段

  • Joinpoint(連接點),程序運行過程中可執(zhí)行特定處理(增強(qiáng)處理)的點, 如異常處理。而在SpringAOP中,方法調(diào)用是連接點

  • Advice(通知、處理、增強(qiáng)處理),在符合的連接點進(jìn)行的特定處理 (增強(qiáng)處理)

  • Pointcut(切入點),可切入進(jìn)行增強(qiáng)處理的連接點。AOP核心之一就是如何用表達(dá)式來定義符合的切入點。在Spring中,默認(rèn)使用AspectJ的切入點語法

  • Target(目標(biāo)對象),被進(jìn)行增強(qiáng)處理的對象

  • AOP代理,是一個重新封裝了(增強(qiáng)處理 + 被代理對象的方法 )方法的代理對象

  • 織入(Weaving),增強(qiáng)處理切入目標(biāo)對象以后,并獲得代理對象(AOP代理)的這個過程

Spring AOP有兩種實現(xiàn)方式:

  • 采用動態(tài)代理技術(shù),利用截取消息的方式,對該消息進(jìn)行裝飾,以取代原有對象行為的執(zhí)行

  • 采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼

AOP的主要應(yīng)用場景
權(quán)限控制、異常處理、緩存、事務(wù)管理、日志、數(shù)據(jù)校驗,etc

Spring AOP基于注解的零配置方式

  • 啟動@AspectJ注解支持,旭在相應(yīng)的容器內(nèi),加入如下片段
<beans  xmlns:aop="http://www.springframework.org/schema/aop" <!-- 必須有相應(yīng)的XML Schema 配置 -->
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 

        <!-- 必須相應(yīng)的容器內(nèi),啟動@AspectJ支持,如對Springmvc的Contrller織入,  則應(yīng)在Springmvc.xml中配置 -->
        <aop:aspectj-autoproxy />
        <!-- 掃描相應(yīng)的包 -->
  • 定義切面bean
@Aspect
@Compement
public class Advice{

    /*定義切入點, 業(yè)務(wù)處理邏輯等等其他內(nèi)容*/

}
  • 定義@Before、@After、@Around等增強(qiáng)處理
  /*定義切入點表達(dá)式*/
  /*配置匹配service包下所有的類、所有的方法*/
  @Pointcut("execution(* com.xxx.xxx.service.*.*(..))")
  public void pointCutExpress(){
  }
  • 定義處理方法
    @After("pointCutExpress()")
    public  void closeResource(){
        /*After注解,更適合于釋放資源*/
    }

-IOC

Ioc—Inversion of Control,即控制反轉(zhuǎn),不是什么技術(shù),而是一種設(shè)計思想。

控制反轉(zhuǎn)是說創(chuàng)建對象的控制權(quán)進(jìn)行轉(zhuǎn)移,以前創(chuàng)建對象的主動權(quán)和創(chuàng)建時機(jī)是由自己把控的,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到第三方,比如轉(zhuǎn)移交給了IoC容器,它就是一個專門用來創(chuàng)建對象的工廠,你要什么對象,它就給你什么對象,有了 IoC容器,依賴關(guān)系就變了,原先的依賴關(guān)系就沒了,它們都依賴IoC容器了,通過IoC容器來建立它們之間的關(guān)系。

IoC是如何做的呢?

有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所?;榻楣芾砹撕芏嗄心信馁Y料,我可以向婚介提出一個列表,告訴它我想找個什么樣的女朋友,比如長得像高圓圓,速度像貝爾,技術(shù)像齊達(dá)內(nèi)之類的,然后婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結(jié)婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機(jī)構(gòu)來控制。

Spring所倡導(dǎo)的開發(fā)方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什么東西,你需要什么東西,然后spring會在系統(tǒng)運行到適當(dāng)?shù)臅r候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創(chuàng)建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉(zhuǎn)。

依賴注入

依賴注入的主要目的還是解耦,讓spring去管理對象。比如在B中調(diào)用A,如果后面A修改頻率高,那么B中就不斷的維護(hù)代碼。倘若使用spring托管,也就是Ioc。只需要在spring配置文件中,修改A的相關(guān)配置即可,這樣,耦合降低了,提高了重用性。而且也解耦合,符合軟件工程的思想。

在spring ioc中有三種依賴注入,分別是:
1、接口注入;
2、setter方法注入;
3、構(gòu)造方法注入;

-Spring Boot 和 Spring Cloud的比較

  • spring boot 是 Spring 的一套快速配置腳手架,可以基于spring boot 快速開發(fā)單個微服務(wù);

  • spring Cloud是一個基于Spring Boot實現(xiàn)的云應(yīng)用開發(fā)工具;Spring boot專注于快速、方便集成的單個個體,Spring Cloud是關(guān)注全局的服務(wù)治理框架;

  • spring boot使用了默認(rèn)大于配置的理念,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot來實現(xiàn);

  • Spring boot可以離開Spring Cloud獨立使用開發(fā)項目,但是Spring Cloud離不開Spring boot,屬于依賴的關(guān)系;

  • 相互關(guān)系:spring -> spring boot > spring cloud。

例如,某項目A是基于spring cloud,下面的子模塊用戶、商品、訂單、物流、銷售分別為獨立的微服務(wù)。如果微服務(wù)內(nèi)部相互調(diào)用,可以通過Eureka、或Zookeeper來實現(xiàn)。

-Eureka

做為服務(wù)注冊中心,Eureka是Netflix開發(fā)的服務(wù)發(fā)現(xiàn)組件,本身是一個基于REST的服務(wù)。Spring Cloud將它集成在其子項目spring-cloud-netflix中,以實現(xiàn)Spring Cloud的服務(wù)發(fā)現(xiàn)功能。

代碼結(jié)構(gòu)示意圖

Eureka的程序構(gòu)成:

  • 是純正的 servlet 應(yīng)用,需構(gòu)建成war包部署

  • 使用了 Jersey 框架實現(xiàn)自身的 RESTful HTTP接口

  • peer之間的同步與服務(wù)的注冊全部通過 HTTP 協(xié)議實現(xiàn)

  • 定時任務(wù)(發(fā)送心跳、定時清理過期服務(wù)、節(jié)點同步等)通過 JDK 自帶的 Timer 實現(xiàn)

  • 內(nèi)存緩存使用Google的guava包實現(xiàn)

Eureka架構(gòu)示意圖

圖中主要的組件:

  • Application Service 相當(dāng)于本書中的服務(wù)提供者,Application Client相當(dāng)于本書中的服務(wù)消費者;

  • Make Remote Call,可以簡單理解為調(diào)用RESTful API;
    us-east-1c、us-east-1d等都是zone,它們都屬于us-east-1這個region;

另外,Eureka包含兩個組件,Eureka ServerEureka Client,它們的作用如下:

  • Eureka Client是一個Java客戶端,用于簡化與Eureka Server的交互;

  • Eureka Server提供服務(wù)發(fā)現(xiàn)的能力,各個微服務(wù)啟動時,會通過Eureka Client向Eureka Server進(jìn)行注冊自己的信息(例如網(wǎng)絡(luò)信息),Eureka Server會存儲該服務(wù)的信息;

  • 微服務(wù)啟動后,會周期性地向Eureka Server發(fā)送心跳(默認(rèn)周期為30秒)以續(xù)約自己的信息。如果Eureka Server在一定時間內(nèi)沒有接收到某個微服務(wù)節(jié)點的心跳,Eureka Server將會注銷該微服務(wù)節(jié)點(默認(rèn)90秒);

  • 每個Eureka Server同時也是Eureka Client,多個Eureka Server之間通過復(fù)制的方式完成服務(wù)注冊表的同步;

  • Eureka Client會緩存Eureka Server中的信息。即使所有的Eureka Server節(jié)點都宕掉,服務(wù)消費者依然可以使用緩存中的信息找到服務(wù)提供者。

-Zookeeper

ZooKeeper是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個開源的實現(xiàn),是Hadoop和Hbase的重要組件。它是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。

-BeanFactory與ApplicationContext

ApplicationContext是BeanFactory的子接口,也被稱為應(yīng)用上下文。BeanFactory提供了Spring的配置框架和基本功能,ApplicationContext則添加了更多企業(yè)級功能(如國際化的支持)。

ApplicationContext的另一重要優(yōu)勢在于當(dāng)ApplicationContext容器初始化完成后,容器中所有的 singleton Bean 也都被實例化。也就是說當(dāng)你需要使用singleton Bean 是,在應(yīng)用中無需等待就可以用,而其他BeanFactory接口的實現(xiàn)類,則會延遲到調(diào)用 getBean()方法時構(gòu)造,ApplicationContext的初始化時間會稍長些,調(diào)用getBean()是由于Bean已經(jīng)構(gòu)造完畢,速度會更快。因此大部分系統(tǒng)都使用ApplicationContext,而只在資源較少的情況下,才考慮使用BeanFactory。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容