天天看點

Spring面試基礎

spring面試總結

spring的核心是控制反轉(ioc)和面向切面程式設計(aop)

spring是一個輕量級的ioc和aop容器架構。目的是為了解決企業級應用開發的業務邏輯層和其他各層的耦合問題以及應用開發的複雜性,簡化java開發

優點:

spring屬于低侵入設計,代碼的污染極低

spring的di機制将對象之間的依賴關系交由架構處理,減低元件的耦合性

spring提供了aop技術,支援将一些通用的任務,如安全,事務,日志,權限等進行集中式管理,進而提供更好的複用

spring對于主流的應用架構提供了內建支援

ioc就是控制反轉,把建立對象的控制權轉交給spring架構進行管理,并由spring根據配置檔案去建立執行個體和管理各個執行個體之間的依賴關系,對象與對象之間松耦合,也利于功能的複用,di依賴注入,和控制反轉是同一個概念的不同角度的描述,即應用程式在運作時依賴ioc容器來動态注入對象需要的外部依賴

最直覺的表達就是,以前建立對象的主動權和時機都是自己把控的,ioc讓對象的建立不用去new了,可以由spring自動生産,使用java的反射機制,根據配置檔案在運作時動态的去建立對象以及管理對象,并調用對象的方法

spring的ioc有三種方式注入:構造器注入,set方法注入,根據注解注入

aop(aspect oriented programming)意為:面向切面程式設計,通過預編譯方式和運作期動态代理實作程式功能的統一維護的一種技術。

提供聲明式事務;允許使用者自定義切面

即 aop 在 不改變原有代碼的情況下 , 去增加新的功能 (方法增強)

aop一般被稱為面向切面程式設計,作為面向對象的一種補充,用于将那些與業務無關,但卻對多個對象産生影響的公共行為和邏輯,抽取并封裝為一個可重用的子產品,這個子產品被命名為切面(aspect),減少系統中的重複代碼,降低了子產品間的耦合度,提高系統的可維護性,可用于權限認證,日志,事務處理

aop的實作關鍵在于代理模式,aop代理主要分為靜态代理和動态代理,靜态代理的代表為aspectj,動态代理則以spring aop為代表

springaop中的動态代理有兩種情況:jdk代理和cglib代理,有接口的情況使用jdk動态代理,沒有接口的情況,使用cglib動态代理

切面(aspect):共有功能的實作,如權限切面,日志切面等。通俗了解:在實際開發中通常用一個存放共有功能實作的标準java類,當java類使用了@aspect注解修飾時,就能被aop容器識别為切面

通知(advice):屬于切面的具體實作,就是要給目标對象織入事情。通俗了解:在實際開發中通常是切面類中的一個方法,具體屬于哪類通知,通過方法上的注解區分

連接配接點(joinpoint):程式在運作過程中能夠插入切面的點。通俗了解:一個類的所有方法前,後,抛出異常時等都是連接配接點

切入點(pointcut):用于定義通知應該切入到哪些點上,不同的通知通常需要切入到不同的連接配接點上,這種精準的比對是由切入點的正規表達式來定義的。通俗了解:切入點就是來定義哪些類裡面的哪些方法會得到通知

目标對象(target):那些即将切入切面的對象,也就是那些被通知的對象。這些對象專注業務本身的邏輯,所有的共有功能等待aop容器的切入

織入(weaving):将切面應用到目标對象進而建立一個新的代理對象的過程。這個過程可以發生在編譯時、類加載時、運作時。spring是在運作時完成織入,運作時織入通過java語言的反射機制與動态代理機制來動态實作

代理對象(proxy):将通知應用到目标對象之後被動态建立的對象。可以簡單地了解為,代理對象的功能等于目标對象本身業務邏輯加上共有功能。代理對象對于使用者而言是透明的,是程式運作過程中的産物。目标對象被織入共有功能後産生的對象

beanfactory和applicationcontext是spring的兩大核心接口,都可以當做spring的容器(看底層源碼可以知道,applicationcontext是beanfactory的子類)

當我們使用applicationcontext去擷取bean的時候,在加載xxx.xml的時候,會建立所有的配置單執行個體bean

當我們使用beanfactory去擷取bean的時候,我們隻是執行個體化了該容器,而該容器中的bean并沒有被執行個體化。當我們getbean的時候,才會實時執行個體化該bean對象

beanfactory和applicationcontext都支援beanpostprocessor、beanfactorypostprocessor的使用,但兩者之間的差別是:beanfactory需要手動注冊,而 applicationcontext則是自動注冊

差別總結:applicationcontext啟動後預載入所有的單執行個體bean,是以在運作的時候速度比較快,因為它們已經建立好了。相對于beanfactory,applicationcontext 唯一的不足是占用記憶體空間,當應用程式配置bean較多時,程式啟動較慢

未完待續...