Spring面試題集錦(精選)

以下來自網(wǎng)絡(luò)收集,找不到原文出處。此次主要為了面試收集,希望對(duì)大家有所幫助~~~~

Spring面試題集錦(精選)

1.什么是Spring?

Spring是一個(gè)開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Java應(yīng)用程序中,但對(duì)Java EE平臺(tái)上的Web應(yīng)用程序有更好的擴(kuò)展性。Spring框架的目標(biāo)是使得Java EE應(yīng)用程序的開發(fā)更加簡捷,通過使用POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程風(fēng)格。

2.Spring有哪些優(yōu)點(diǎn)?

  • 輕量級(jí):Spring在大小和透明性方面絕對(duì)屬于輕量級(jí)的,基礎(chǔ)版本的Spring框架大約只有2MB。
  • 控制反轉(zhuǎn)(IOC):Spring使用控制反轉(zhuǎn)技術(shù)實(shí)現(xiàn)了松耦合。依賴被注入到對(duì)象,而不是創(chuàng)建或?qū)ふ乙蕾噷?duì)象。
  • 面向切面編程(AOP): Spring支持面向切面編程,同時(shí)把應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)的服務(wù)分離開來。
  • 容器:Spring包含并管理應(yīng)用程序?qū)ο蟮呐渲眉吧芷凇?/li>
  • MVC框架:Spring的web框架是一個(gè)設(shè)計(jì)優(yōu)良的web MVC框架,很好的取代了一些web框架。
  • 事務(wù)管理:Spring對(duì)下至本地業(yè)務(wù)上至全局業(yè)務(wù)(JAT)提供了統(tǒng)一的事務(wù)管理接口。
  • 異常處理:Spring提供一個(gè)方便的API將特定技術(shù)的異常(由JDBC, Hibernate, 或JDO拋出)轉(zhuǎn)化為一致的、Unchecked異常。

3. Spring 事務(wù)實(shí)現(xiàn)方式有哪些?

  • 編程式事務(wù)管理:這意味著你可以通過編程的方式管理事務(wù),這種方式帶來了很大的靈活性,但很難維護(hù)。
  • 聲明式事務(wù)管理:這種方式意味著你可以將事務(wù)管理和業(yè)務(wù)代碼分離。你只需要通過注解或者XML配置管理事務(wù)。

4.Spring框架的事務(wù)管理有哪些優(yōu)點(diǎn)?

  • 它為不同的事務(wù)API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統(tǒng)一的編程模型。
  • 它為編程式事務(wù)管理提供了一個(gè)簡單的API而非一系列復(fù)雜的事務(wù)API(如JTA). 它支持聲明式事務(wù)管理。
  • 它可以和Spring 的多種數(shù)據(jù)訪問技術(shù)很好的融合。

5.spring事務(wù)定義的傳播規(guī)則

  • PROPAGATION_REQUIRED: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。這是最常見的選擇。
  • PROPAGATION_SUPPORTS: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。
  • PROPAGATION_MANDATORY: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。
  • PROPAGATION_REQUIRES_NEW: 新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
  • PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
  • PROPAGATION_NEVER: 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則進(jìn)行與PROPAGATION_REQUIRED類似的操作。

6.Spring 事務(wù)底層原理

  • 劃分處理單元——IoC

由于spring解決的問題是對(duì)單個(gè)數(shù)據(jù)庫進(jìn)行局部事務(wù)處理的,具體的實(shí)現(xiàn)首先用spring中的IoC劃分了事務(wù)處理單元。并且將對(duì)事務(wù)的各種配置放到了ioc容器中(設(shè)置事務(wù)管理器,設(shè)置事務(wù)的傳播特性及隔離機(jī)制)。

  • AOP攔截需要進(jìn)行事務(wù)處理的類

Spring事務(wù)處理模塊是通過AOP功能來實(shí)現(xiàn)聲明式事務(wù)處理的,具體操作(比如事務(wù)實(shí)行的配置和讀取,事務(wù)對(duì)象的抽象),用TransactionProxyFactoryBean接口來使用AOP功能,生成proxy代理對(duì)象,通過TransactionInterceptor完成對(duì)代理方法的攔截,將事務(wù)處理的功能編織到攔截的方法中。讀取ioc容器事務(wù)配置屬性,轉(zhuǎn)化為spring事務(wù)處理需要的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(TransactionAttributeSourceAdvisor),轉(zhuǎn)化為TransactionAttribute表示的數(shù)據(jù)對(duì)象。

  • 對(duì)事務(wù)處理實(shí)現(xiàn)(事務(wù)的生成、提交、回滾、掛起)

spring委托給具體的事務(wù)處理器實(shí)現(xiàn)。實(shí)現(xiàn)了一個(gè)抽象和適配。適配的具體事務(wù)處理器:DataSource數(shù)據(jù)源支持、hibernate數(shù)據(jù)源事務(wù)處理支持、JDO數(shù)據(jù)源事務(wù)處理支持,JPA、JTA數(shù)據(jù)源事務(wù)處理支持。這些支持都是通過設(shè)計(jì)PlatformTransactionManager、AbstractPlatforTransaction一系列事務(wù)處理的支持。 為常用數(shù)據(jù)源支持提供了一系列的TransactionManager。

  • 結(jié)合

PlatformTransactionManager實(shí)現(xiàn)了TransactionInterception接口,讓其與TransactionProxyFactoryBean結(jié)合起來,形成一個(gè)Spring聲明式事務(wù)處理的設(shè)計(jì)體系。

7. Spring的單例實(shí)現(xiàn)原理

Spring框架對(duì)單例的支持是采用單例注冊(cè)表的方式進(jìn)行實(shí)現(xiàn)的,而這個(gè)注冊(cè)表的緩存是HashMap對(duì)象,如果配置文件中的配置信息不要求使用單例,Spring會(huì)采用新建實(shí)例的方式返回對(duì)象實(shí)例。

8. 有哪些不同類型的IOC(依賴注入)?

  • 構(gòu)造器依賴注入:構(gòu)造器依賴注入在容器觸發(fā)構(gòu)造器的時(shí)候完成,該構(gòu)造器有一系列的參數(shù),每個(gè)參數(shù)代表注入的對(duì)象。

  • Setter方法依賴注入:首先容器會(huì)觸發(fā)一個(gè)無參構(gòu)造函數(shù)或無參靜態(tài)工廠方法實(shí)例化對(duì)象,之后容器調(diào)用bean中的setter方法完成Setter方法依賴注入。

  • 注解注入:基于@Autowired的自動(dòng)裝配,默認(rèn)是根據(jù)類型注入,可以用于構(gòu)造器、字段、方法注入。

9. 你推薦哪種依賴注入?構(gòu)造器依賴注入還是Setter方法依賴注入?

你可以同時(shí)使用兩種方式的依賴注入,最好的選擇是使用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴注入,使用setter方法實(shí)現(xiàn)可選的依賴關(guān)系。

10.簡述一下Spring框架?

概念

  • Spring致力于Java EE應(yīng)用的各種解決方案,是一款輕量級(jí)框架,大大簡化了Java企業(yè)級(jí)開發(fā),提供了強(qiáng)大、穩(wěn)定的功能。
  • Spring主要有兩個(gè)目標(biāo):一是讓先有技術(shù)更易于使用,二是促進(jìn)良好的編程習(xí)慣(或者稱為最佳實(shí)踐)

優(yōu)點(diǎn)

  • 輕量級(jí):Spring在大小和透明性方面絕對(duì)屬于輕量級(jí)的,基礎(chǔ)版本的Spring框架大約只有2MB

  • 控制反轉(zhuǎn)(IOC):Spring使用控制反轉(zhuǎn)技術(shù)實(shí)現(xiàn)了松耦合。依賴被注入到對(duì)象,而不是創(chuàng)建或?qū)ふ乙蕾噷?duì)象。

  • 方便解耦,簡化開發(fā):Spring就是一個(gè)大工廠,可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù),交給Spring管理

  • AOP編程的支持:Spring提供面向切面編程,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控等功能

  • 聲明式事務(wù)的支持:只需要通過配置就可以完成對(duì)事務(wù)的管理,而無需手動(dòng)編程

  • 方便集成各種優(yōu)秀框架:Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對(duì)各種優(yōu)秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持

  • 降低JavaEE API的使用難度:Spring 對(duì)JavaEE開發(fā)中非常難用的一些API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝,使這些API應(yīng)用難度大大降低

11.簡單介紹一下Spring七大模塊?

  • Spring Core:Core封裝包是框架的最基礎(chǔ)部分,提供IOC和依賴注入特性。這里的基礎(chǔ)概念是BeanFactory,它提供對(duì)Factory模式的經(jīng)典實(shí)現(xiàn)來消除對(duì)程序性單例模式的需要,并真正地允許你從程序邏輯中分離出依賴關(guān)系和配置。

  • Spring Context:構(gòu)建于Core封裝包基礎(chǔ)上的 Context封裝包,提供了一種框架式的對(duì)象訪問方法,有些象JNDI注冊(cè)器。Context封裝包的特性得自于Beans封裝包,并添加了對(duì)國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創(chuàng)建,比如說通過Servlet容器。

  • Spring DAO:DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數(shù)據(jù)庫廠商特有的錯(cuò)誤代碼。 并且,JDBC封裝包還提供了一種比編程性更好的聲明性事務(wù)管理方法,不僅僅是實(shí)現(xiàn)了特定接口,而且對(duì)所有的POJOs(plain old Java objects)都適用。

  • Spring ORM:ORM 封裝包提供了常用的“對(duì)象/關(guān)系”映射APIs的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進(jìn)行“對(duì)象/關(guān)系”映射,如前邊提到的簡單聲明性事務(wù)管理。

  • Spring AOP:Spring的 AOP 封裝包提供了符合AOP Alliance規(guī)范的面向方面的編程實(shí)現(xiàn),讓你可以定義,例如方法攔截器(method-interceptors)和切點(diǎn)(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數(shù)據(jù)功能,還可以將各種行為信息合并到你的代碼中。

  • Spring Web:Spring中的 Web 包提供了基礎(chǔ)的針對(duì)Web開發(fā)的集成特性,例如多方文件上傳,利用Servlet listeners進(jìn)行IOC容器初始化和針對(duì)Web的ApplicationContext。當(dāng)與WebWork或Struts一起使用Spring時(shí),這個(gè)包使Spring可與其他框架結(jié)合。

  • Spring Web MVC:Spring中的MVC封裝包提供了Web應(yīng)用的Model-View-Controller(MVC)實(shí)現(xiàn)。Spring的MVC框架并不是僅僅提供一種傳統(tǒng)的實(shí)現(xiàn),它提供了一種清晰的分離模型,在領(lǐng)域模型代碼和Web Form之間。并且,還可以借助Spring框架的其他特性。

12. Spring中的設(shè)計(jì)模式

spring中常用的設(shè)計(jì)模式達(dá)到九種,我們舉例說明:

第一種:簡單工廠

又叫做靜態(tài)工廠方法(StaticFactory Method)模式,但不屬于23種GOF設(shè)計(jì)模式之一。 簡單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類。 spring中的BeanFactory就是簡單工廠模式的體現(xiàn),根據(jù)傳入一個(gè)唯一的標(biāo)識(shí)來獲得bean對(duì)象,但是否是在傳入?yún)?shù)后創(chuàng)建還是傳入?yún)?shù)前創(chuàng)建這個(gè)要根據(jù)具體情況來定。

第二種:工廠方法(Factory Method)

通常由應(yīng)用程序直接使用new創(chuàng)建新的對(duì)象,為了將對(duì)象的創(chuàng)建和使用相分離,采用工廠模式,即應(yīng)用程序?qū)?duì)象的創(chuàng)建及初始化職責(zé)交給工廠對(duì)象。一般情況下,應(yīng)用程序有自己的工廠對(duì)象來創(chuàng)建bean.如果將應(yīng)用程序自己的工廠對(duì)象交給Spring管理,那么Spring管理的就不是普通的bean,而是工廠Bean。

第三種:單例模式(Singleton)

保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
spring中的單例模式完成了后半句話,即提供了全局的訪問點(diǎn)BeanFactory。但沒有從構(gòu)造器級(jí)別去控制單例,這是因?yàn)閟pring管理的是是任意的java對(duì)象。

第四種:適配器(Adapter)

在Spring的Aop中,使用的Advice(通知)來增強(qiáng)被代理類的功能。Spring實(shí)現(xiàn)這一AOP功能的原理就使用代理模式(1、JDK動(dòng)態(tài)代理。2、CGLib字節(jié)碼生成技術(shù)代理。)對(duì)類進(jìn)行方法級(jí)別的切面增強(qiáng),即,生成被代理類的代理類, 并在代理類的方法前,設(shè)置攔截器,通過執(zhí)行攔截器重的內(nèi)容增強(qiáng)了代理方法的功能,實(shí)現(xiàn)的面向切面編程。

第五種:包裝器(Decorator)

在我們的項(xiàng)目中遇到這樣一個(gè)問題:我們的項(xiàng)目需要連接多個(gè)數(shù)據(jù)庫,而且不同的客戶在每次訪問中根據(jù)需要會(huì)去訪問不同的數(shù)據(jù)庫。我們以往在spring和hibernate框架中總是配置一個(gè)數(shù)據(jù)源,因而sessionFactory的dataSource屬性總是指向這個(gè)數(shù)據(jù)源并且恒定不變,所有DAO在使用sessionFactory的時(shí)候都是通過這個(gè)數(shù)據(jù)源訪問數(shù)據(jù)庫。但是現(xiàn)在,由于項(xiàng)目的需要,我們的DAO在訪問sessionFactory的時(shí)候都不得不在多個(gè)數(shù)據(jù)源中不斷切換,問題就出現(xiàn)了:如何讓sessionFactory在執(zhí)行數(shù)據(jù)持久化的時(shí)候,根據(jù)客戶的需求能夠動(dòng)態(tài)切換不同的數(shù)據(jù)源?我們能不能在spring的框架下通過少量修改得到解決?是否有什么設(shè)計(jì)模式可以利用呢? 首先想到在spring的applicationContext中配置所有的dataSource。這些dataSource可能是各種不同類型的,比如不同的數(shù)據(jù)庫:Oracle、SQL Server、MySQL等,也可能是不同的數(shù)據(jù)源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然后sessionFactory根據(jù)客戶的每次請(qǐng)求,將dataSource屬性設(shè)置成不同的數(shù)據(jù)源,以到達(dá)切換數(shù)據(jù)源的目的。
spring中用到的包裝器模式在類名上有兩種表現(xiàn):一種是類名中含有Wrapper,另一種是類名中含有Decorator。基本上都是動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。

第六種:代理(Proxy)

為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。 從結(jié)構(gòu)上來看和Decorator模式類似,但Proxy是控制,更像是一種對(duì)功能的限制,而Decorator是增加職責(zé)。
spring的Proxy模式在aop中有體現(xiàn),比如JdkDynamicAopProxy和Cglib2AopProxy。

第七種:觀察者(Observer)

定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
spring中Observer模式常用的地方是listener的實(shí)現(xiàn)。如ApplicationListener。

第八種:策略(Strategy)

定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化。

第九種:模板方法(Template Method)

定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
Template Method模式一般是需要繼承的。這里想要探討另一種對(duì)Template Method的理解。spring中的JdbcTemplate,在用這個(gè)類時(shí)并不想去繼承這個(gè)類,因?yàn)檫@個(gè)類的方法太多,但是我們還是想用到JdbcTemplate已有的穩(wěn)定的、公用的數(shù)據(jù)庫連接,那么我們?cè)趺崔k呢?我們可以把變化的東西抽出來作為一個(gè)參數(shù)傳入JdbcTemplate的方法中。但是變化的東西是一段代碼,而且這段代碼會(huì)用到JdbcTemplate中的變量。怎么辦?那我們就用回調(diào)對(duì)象吧。在這個(gè)回調(diào)對(duì)象中定義一個(gè)操縱JdbcTemplate中變量的方法,我們?nèi)?shí)現(xiàn)這個(gè)方法,就把變化的東西集中到這里了。然后我們?cè)賯魅脒@個(gè)回調(diào)對(duì)象到JdbcTemplate,從而完成了調(diào)用。這可能是Template Method不需要繼承的另一種實(shí)現(xiàn)方式吧。

13.ApplicationContext與BeanFactory的區(qū)別

兩者都是通過xml配置文件加載bean,ApplicationContextBeanFacotry相比,提供了更多的擴(kuò)展功能,但其主要區(qū)別在于后者是延遲加載,如果Bean的某一個(gè)屬性沒有注入,BeanFacotry加載后,直至第一次使用調(diào)用getBean方法才會(huì)拋出異常;而ApplicationContext則在初始化自身是檢驗(yàn),這樣有利于檢查所依賴屬性是否注入;所以通常情況下我們選擇使用ApplicationContext。

BeanFactroy采用的是延遲加載形式來注入Bean的,即只有在使用到某個(gè)Bean時(shí)(調(diào)用getBean()),才對(duì)該Bean進(jìn)行加載實(shí)例化,這樣,我們就不能發(fā)現(xiàn)一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啟動(dòng)時(shí),一次性創(chuàng)建了所有的Bean。這樣,在容器啟動(dòng)時(shí),我們就可以發(fā)現(xiàn)Spring中存在的配置錯(cuò)誤。

BeanFactoryApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區(qū)別是:BeanFactory需要手動(dòng)注冊(cè),而ApplicationContext則是自動(dòng)注冊(cè)

14. 如何理解IoC和DI?

IOC:
IOC就是控制反轉(zhuǎn),通俗的說就是我們不用自己創(chuàng)建實(shí)例對(duì)象,這些都交給Spring的bean工廠幫我們創(chuàng)建管理。這也是Spring的核心思想,通過面向接口編程的方式來是實(shí)現(xiàn)對(duì)業(yè)務(wù)組件的動(dòng)態(tài)依賴。這就意味著IOC是Spring針對(duì)解決程序耦合而存在的。在實(shí)際應(yīng)用中,Spring通過配置文件(xml或者properties)指定需要實(shí)例化的java類(類名的完整字符串),包括這些java類的一組初始化值,通過加載讀取配置文件,用Spring提供的方法(getBean())就可以獲取到我們想要的根據(jù)指定配置進(jìn)行初始化的實(shí)例對(duì)象。

  • 優(yōu)點(diǎn):IOC或依賴注入減少了應(yīng)用程序的代碼量。它使得應(yīng)用程序的測試很簡單,因?yàn)樵趩卧獪y試中不再需要單例或JNDI查找機(jī)制。簡單的實(shí)現(xiàn)以及較少的干擾機(jī)制使得松耦合得以實(shí)現(xiàn)。IOC容器支持勤性單例及延遲加載服務(wù)。

** DI:DI—Dependency** Injection,即“依賴注入”:組件之間依賴關(guān)系由容器在運(yùn)行期決定,形象的說,即由容器動(dòng)態(tài)的將某個(gè)依賴關(guān)系注入到組件之中。依賴注入的目的并非為軟件系統(tǒng)帶來更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái)。通過依賴注入機(jī)制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標(biāo)需要的資源,完成自身的業(yè)務(wù)邏輯,而不需要關(guān)心具體的資源來自何處,由誰實(shí)現(xiàn)。

15.介紹一下AOP相關(guān)術(shù)語?

  • 切面(Aspect):被抽取的公共模塊,可能會(huì)橫切多個(gè)對(duì)象。 在Spring AOP中,切面可以使用通用類(基于模式的風(fēng)格) 或者在普通類中以 @AspectJ 注解來實(shí)現(xiàn)。

  • 連接點(diǎn)(Join point):指方法,在Spring AOP中,一個(gè)連接點(diǎn) 總是 代表一個(gè)方法的執(zhí)行。

  • 通知(Advice):在切面的某個(gè)特定的連接點(diǎn)(Join point)上執(zhí)行的動(dòng)作。通知有各種類型,其中包括“around”、“before”和“after”等通知。許多AOP框架,包括Spring,都是以攔截器做通知模型, 并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈。

  • 切入點(diǎn)(Pointcut):切入點(diǎn)是指 我們要對(duì)哪些Join point進(jìn)行攔截的定義。通過切入點(diǎn)表達(dá)式,指定攔截的方法,比如指定攔截add、search

  • 引入(Introduction):(也被稱為內(nèi)部類型聲明(inter-type declaration))。聲明額外的方法或者某個(gè)類型的字段。Spring允許引入新的接口(以及一個(gè)對(duì)應(yīng)的實(shí)現(xiàn))到任何被代理的對(duì)象。例如,你可以使用一個(gè)引入來使bean實(shí)現(xiàn) IsModified 接口,以便簡化緩存機(jī)制。

  • 目標(biāo)對(duì)象(Target Object): 被一個(gè)或者多個(gè)切面(aspect)所通知(advise)的對(duì)象。也有人把它叫做 被通知(adviced) 對(duì)象。 既然Spring AOP是通過運(yùn)行時(shí)代理實(shí)現(xiàn)的,這個(gè)對(duì)象永遠(yuǎn)是一個(gè) 被代理(proxied) 對(duì)象。

  • 織入(Weaving):指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來創(chuàng)建新的代理對(duì)象的過程。Spring是在運(yùn)行時(shí)完成織入。

切入點(diǎn)(pointcut)和連接點(diǎn)(join point)匹配的概念是AOP的關(guān)鍵,這使得AOP不同于其它僅僅提供攔截功能的舊技術(shù)。 切入點(diǎn)使得定位通知(advice)可獨(dú)立于OO層次。 例如,一個(gè)提供聲明式事務(wù)管理的around通知可以被應(yīng)用到一組橫跨多個(gè)對(duì)象中的方法上(例如服務(wù)層的所有業(yè)務(wù)操作)。

AOP相關(guān)術(shù)語

16.你是如何理解Spring AOP?

概念

面向切面編程。AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。

核心思想
可以在不修改源代碼的前提下,對(duì)程序進(jìn)行增強(qiáng)

實(shí)現(xiàn)原理
Spring框架的AOP技術(shù)底層也是采用的代理技術(shù),所謂的動(dòng)態(tài)代理就是說 AOP 框架不會(huì)去修改字節(jié)碼,而是在內(nèi)存中臨時(shí)為方法生成一個(gè) AOP 對(duì)象,這個(gè) AOP 對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法 。Spring AOP 中的動(dòng)態(tài)代理主要有兩種方式, JDK 動(dòng)態(tài)代理和 CGLIB 動(dòng)態(tài)代理 。

  • JDK 動(dòng)態(tài)代理:通過反射來接收被代理的類,并且要求被代理的類必須實(shí)現(xiàn)一個(gè)接口 。JDK 動(dòng)態(tài)代理的核心是 InvocationHandler 接口和 Proxy 類 。

  • CGLIB動(dòng)態(tài)代理: 如果目標(biāo)類沒有實(shí)現(xiàn)接口,那么 Spring AOP 會(huì)選擇使用 CGLIB 來動(dòng)態(tài)代理目標(biāo)類 。CGLIB ( Code Generation Library ),是一個(gè)代碼生成的類庫,可以在運(yùn)行時(shí)動(dòng)態(tài)的生成某個(gè)類的子類,注意, CGLIB 是通過繼承的方式做的動(dòng)態(tài)代理,因此如果某個(gè)類被標(biāo)記為 final ,那么它是無法使用 CGLIB 做動(dòng)態(tài)代理的。

17. Spring中有哪些增強(qiáng)處理,區(qū)別?

  • 前置增強(qiáng):org.springframework.aop.BeforeAdvice代表前置增強(qiáng),表示在目標(biāo)方法整形前實(shí)施增強(qiáng)
  • 后置增強(qiáng):org.springframework.aop.AfterReturningAdvice代表后置增強(qiáng),表示在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng)
  • 環(huán)繞增強(qiáng):org.springframework.aop.MethodInterceptor代表環(huán)繞增強(qiáng),表示在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng)
  • 異常拋出增強(qiáng) :org.springframework.aop.ThrowsAdvice代表拋出異常增強(qiáng),表示在目標(biāo)方法拋出異常后實(shí)施增強(qiáng)
  • 引介增強(qiáng):org.springframework.aop.IntroductionInterceptor代表引介增強(qiáng),表示在目標(biāo)類中添加一些新的方法和屬性

18. Spring中支持的Bean作用域有哪些?

支持如下五種不同的作用域

  • Singleton(默認(rèn)):在Spring IOC容器中僅存在一個(gè)Bean實(shí)例,Bean以單實(shí)例的方式存在。
  • Prototype:一個(gè)bean可以定義多個(gè)實(shí)例
  • Request:每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean。該作用域僅適用于WebApplicationContext環(huán)境。
  • Session:一個(gè)HTTP Session定義一個(gè)Bean。該作用域僅適用于WebApplicationContext環(huán)境.
  • GolbalSession:同一個(gè)全局HTTP Session定義一個(gè)Bean。該作用域同樣僅適用于WebApplicationContext環(huán)境.

19.如何定義bean的作用域?

Spring中創(chuàng)建一個(gè)bean的時(shí)候,我們可以聲明它的作用域。只需要在bean定義的時(shí)候通過scope屬性定義即可。例如,當(dāng)Spring需要產(chǎn)生每次一個(gè)新的bean實(shí)例時(shí),應(yīng)該聲明beanscope屬性為prototype。如果每次你希望Spring返回一個(gè)實(shí)例,應(yīng)該聲明beanscope屬性為singleton

20.說一說Spring框架中的bean的生命周期?

  • Spring容器讀取XML文件中bean的定義并實(shí)例化bean。
  • Spring根據(jù)bean的定義設(shè)置屬性值。
  • 如果該Bean實(shí)現(xiàn)了BeanNameAware接口,Spring將bean的id傳遞給setBeanName()方法。
  • 如果該Bean實(shí)現(xiàn)了BeanFactoryAware接口,Spring將beanfactory傳遞給setBeanFactory()方法。
  • 如果任何bean BeanPostProcessors 和該bean相關(guān),Spring調(diào)用postProcessBeforeInitialization()方法。
  • 如果該Bean實(shí)現(xiàn)了InitializingBean接口,調(diào)用Bean中的afterPropertiesSet方法。如果bean有初始化函數(shù)聲明,調(diào)用相應(yīng)的初始化方法。
  • 如果任何bean BeanPostProcessors 和該bean相關(guān),調(diào)用postProcessAfterInitialization()方法。
  • 如果該bean實(shí)現(xiàn)了DisposableBean,調(diào)用destroy()方法。

21.哪些是最重要的bean生命周期方法,是否能重寫它們?

有兩個(gè)重要的bean生命周期方法。

  • 第一個(gè)是setup方法,該方法在容器加載bean的時(shí)候被調(diào)用。
  • 第二個(gè)是teardown方法,該方法在bean從容器中移除的時(shí)候調(diào)用。
    bean標(biāo)簽有兩個(gè)重要的屬性(init-method 和 destroy-method),你可以通過這兩個(gè)屬性定義自己的初始化方法和析構(gòu)方法。
    Spring也有相應(yīng)的注解:@PostConstruct@PreDestroy。

22.有幾種不同類型的自動(dòng)代理?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

23. 什么是Spring的內(nèi)部bean?

當(dāng)一個(gè)bean僅被用作另一個(gè)bean的屬性時(shí),它能被聲明為一個(gè)內(nèi)部bean,為了定義inner bean,在Spring 的 基于XML的 配置元數(shù)據(jù)中,可以在 或 元素內(nèi)使用 元素,內(nèi)部bean通常是匿名的,它們的Scope一般是prototype。

24. Spring中自動(dòng)裝配的方式有哪些?

  • no:不進(jìn)行自動(dòng)裝配,手動(dòng)設(shè)置Bean的依賴關(guān)系。
  • byName:根據(jù)Bean的名字進(jìn)行自動(dòng)裝配。
  • byType:根據(jù)Bean的類型進(jìn)行自動(dòng)裝配。
  • constructor:類似于byType,不過是應(yīng)用于構(gòu)造器的參數(shù),如果正好有一個(gè)Bean與構(gòu)造器的參數(shù)類型相同則可以自動(dòng)裝配,否則會(huì)導(dǎo)致錯(cuò)誤。
  • autodetect:如果有默認(rèn)的構(gòu)造器,則通過constructor的方式進(jìn)行自動(dòng)裝配,否則使用byType的方式進(jìn)行自動(dòng)裝配。

說明:自動(dòng)裝配沒有自定義裝配方式那么精確,而且不能自動(dòng)裝配簡單屬性(基本類型、字符串等),在使用時(shí)應(yīng)注意。

25.你可以在Spring中注入null或空字符串嗎?

完全可以。

26. 不同版本的 Spring Framework 有哪些主要功能?

Version Feature
Spring 2.5 發(fā)布于 2007 年。這是第一個(gè)支持注解的版本。
Spring 3 發(fā)布于 2009 年。它完全利用了 Java5 中的改進(jìn),并為 JEE6 提供了支持。
Spring 4.0 發(fā)布于 2013 年。這是第一個(gè)完全支持 JAVA8 的版本。。

27.spring DAO 有什么用?

Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術(shù)更容易以一種統(tǒng)一的方式工作。這使得用戶容易在持久性技術(shù)之間切換。它還允許您在編寫代碼時(shí),無需考慮捕獲每種技術(shù)不同的異常。

28. 列舉 Spring DAO 拋出的異常。

spring-data-access-exception

29. spring JDBC API 中存在哪些類?

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

30.Spring AOP and AspectJ AOP 有什么區(qū)別?

Spring AOP 基于動(dòng)態(tài)代理方式實(shí)現(xiàn);AspectJ 基于靜態(tài)代理方式實(shí)現(xiàn)。
Spring AOP 僅支持方法級(jí)別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級(jí)別的 PointCut。

推薦

大廠筆試內(nèi)容集合(內(nèi)有詳細(xì)解析) 持續(xù)更新中....

ProcessOn是一個(gè)在線作圖工具的聚合平臺(tái)~

文末

歡迎關(guān)注個(gè)人微信公眾號(hào):Coder編程
歡迎關(guān)注Coder編程公眾號(hào),主要分享數(shù)據(jù)結(jié)構(gòu)與算法、Java相關(guān)知識(shí)體系、框架知識(shí)及原理、Spring全家桶、微服務(wù)項(xiàng)目實(shí)戰(zhàn)、DevOps實(shí)踐之路、每日一篇互聯(lián)網(wǎng)大廠面試或筆試題以及PMP項(xiàng)目管理知識(shí)等。更多精彩內(nèi)容正在路上~
新建了一個(gè)qq群:315211365,歡迎大家進(jìn)群交流一起學(xué)習(xí)。謝謝了!也可以介紹給身邊有需要的朋友。

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關(guān)注并star~

微信公眾號(hào)

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

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

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