Spring基础面试题(一)
生活随笔
收集整理的這篇文章主要介紹了
Spring基础面试题(一)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
- Spring是什么?
Spring是一個輕量級的IoC和AOP容器框架。是為Java應(yīng)用程序提供基礎(chǔ)性服務(wù)的一套框架,目的是用于簡化企業(yè)應(yīng)用程序的開發(fā),它使得開發(fā)者只需要關(guān)心業(yè)務(wù)需求。
常見的配置方式有三種:基于XML的配置、基于注解的配置、基于Java的配置。
?
- ?使用Spring框架的好處是什么?
方便解耦,簡化開發(fā)
通過 Spring提供的 IoC容器,可以將對象間的依賴關(guān)系交由 Spring進行控制,避免硬編碼所造成的過度程序耦合。
spring屬于低侵入式設(shè)計,代碼的污染極低。
spring的DI機制將對象之間的依賴關(guān)系交由框架處理,減低組件的耦合性;AOP 編程的支持
通過 Spring的 AOP 功能,支持將一些通用任務(wù),如安全、事務(wù)、日志、權(quán)限等進行集中式管理,從而提供更好的復(fù)用。
方便進行面向切面的編程,許多不容易用傳統(tǒng)OOP 實現(xiàn)的功能可以通過 AOP 輕松應(yīng)付。聲明式事務(wù)的支持
可以將我們從單調(diào)煩悶的事務(wù)管理代碼中解脫出來,通過聲明式方式靈活的進行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。 集成各種優(yōu)秀框架
spring對于主流的應(yīng)用框架提供了集成支持。
?
- ?Spring由哪些模塊組成?
?
Spring Core:核心類庫,提供IOC服務(wù);
Spring Context:提供框架式的Bean訪問方式,以及企業(yè)級功能(JNDI、定時任務(wù)等);
Spring AOP:AOP服務(wù);
Spring DAO:對JDBC的抽象,簡化了數(shù)據(jù)訪問異常的處理;
Spring ORM:對現(xiàn)有的ORM框架的支持;
Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;
Spring MVC:提供面向Web應(yīng)用的Model-View-Controller實現(xiàn)。
?
- 什么是耦合性?耦合性的分類有哪些?如何避免耦合性?
(1)耦合性(Coupling),也叫耦合度,是對模塊間關(guān)聯(lián)程度的度量。(2)耦合有如下分類:
① 內(nèi)容耦合:當(dāng)一個模塊直接修改或操作另一個模塊的數(shù)據(jù)時,或一個模塊不通過正常入口而轉(zhuǎn)入另一個模塊時,這樣的耦合被稱為內(nèi)容耦合。內(nèi)容耦合是最高程度的耦合,應(yīng)該避免使用之。
② 公共耦合:兩個或兩個以上的模塊共同引用一個全局數(shù)據(jù)項,這種耦合被稱為公共耦合。在具有大量公共耦合的結(jié)構(gòu)中,確定究竟是哪個模塊給全局變量賦了一個特定的值是十分困難的。
③ 外部耦合:一組模塊都訪問同一全局簡單變量而不是同一全局數(shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)表傳遞該全局變量的信息,則稱之為外部耦合。
④ 控制耦合:一個模塊通過接口向另一個模塊傳遞一個控制信號,接受信號的模塊根據(jù)信號值而進行適當(dāng)?shù)膭幼?#xff0c;這種耦合被稱為控制耦合。
⑤ 標(biāo)記耦合:若一個模塊 A 通過接口向兩個模塊 B 和 C 傳遞一個公共參數(shù),那么稱模塊 B 和 C 之間存在一個標(biāo)記耦合。
⑥ 數(shù)據(jù)耦合:模塊之間通過參數(shù)來傳遞數(shù)據(jù),稱為數(shù)據(jù)耦合。數(shù)據(jù)耦合是最低的一種耦合形式,系統(tǒng)中一般都存在這種類型的耦合,因為某些模塊的輸出數(shù)據(jù)需要作為另一些模塊的輸入數(shù)據(jù)。
⑦ 非直接耦合:兩個模塊之間沒有直接關(guān)系,它們之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實現(xiàn)的。(3)耦合是影響軟件復(fù)雜程度和設(shè)計質(zhì)量的一個重要因素。
在設(shè)計上我們應(yīng)采用以下原則:如果模塊間必須存在耦合,就盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共耦合的范圍,盡量避免使用內(nèi)容耦合。 ?
- Spring IOC 的理解,其初始化過程?
?
控制反轉(zhuǎn)是就是應(yīng)用本身不負責(zé)依賴對象的創(chuàng)建和維護,依賴對象的創(chuàng)建及維護是由外部容器負責(zé)的,這樣控制權(quán)就有應(yīng)用轉(zhuǎn)移到了外部容器,控制權(quán)的轉(zhuǎn)移就是控制反轉(zhuǎn)。
?
?
IOC 容器的初始化分為三個過程實現(xiàn): 過程一:Resource資源定位,這個Resouce指的是BeanDefinition的資源定位,這個過程就是容器找數(shù)據(jù)的過程。 過程二:BeanDefinition的載入過程,這個載入過程是把用戶定義好的Bean表示成Ioc容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu),而這個容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu)就是BeanDefition。 過程三:向IOC容器注冊這些BeanDefinition的過程,這個過程就是將前面的BeanDefition保存到HashMap中的過程。
Resource定位 IOC容器第一步就是需要定位Resource外部資源。Resource的定位其實就是BeanDefinition的資源定位,它是由ResourceLoader通過統(tǒng)一的Resource接口來完成的,這個Resource對各種形式的BeanDefinition的使用都提供了統(tǒng)一接口。載入 第二個過程就是BeanDefinition的載入,BeanDefinitionReader讀取,解析Resource定位的資源。
也就是將用戶定義好的Bean表示成IOC容器的內(nèi)部數(shù)據(jù)結(jié)構(gòu)也就是BeanDefinition,在IOC容器內(nèi)部維護著一個BeanDefinition Map的數(shù)據(jù)結(jié)構(gòu),通過這樣的數(shù)據(jù)結(jié)構(gòu),IOC容器能夠?qū)ean進行更好的管理。 在配置文件中每一個<bean>都對應(yīng)著一個BeanDefinition對象。注冊 第三個過程則是注冊,即向IOC容器注冊這些BeanDefinition,這個過程是通過BeanDefinitionRegistery接口來實現(xiàn)的。 在IOC容器內(nèi)部其實是將第二個過程解析得到的BeanDefinition注入到一個HashMap容器中,IOC容器就是通過這個HashMap來維護這些BeanDefinition的。經(jīng)過這 (Resource定位,載入,注冊)三個步驟,IOC容器的初始化過程就已經(jīng)完成了。
?
- ?BeanFactory和ApplicationContext的區(qū)別?
BeanFactory和ApplicationContext是Spring的兩大核心接口,都可以當(dāng)做Spring的容器。其中ApplicationContext是BeanFactory的子接口。(1)BeanFactory:是Spring里面最底層的接口,包含了各種Bean的定義,讀取bean配置文檔,管理bean的加載、實例化,控制bean的生命周期,維護bean之間的依賴關(guān)系。
ApplicationContext接口作為BeanFactory的派生,除了提供BeanFactory所具有的功能外,還提供了更完整的框架功能:①繼承MessageSource,因此支持國際化。②統(tǒng)一的資源文件訪問方式。③提供在監(jiān)聽器中注冊bean的事件。④同時加載多個配置文件。⑤載入多個(有繼承關(guān)系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應(yīng)用的web層。(2)①BeanFactroy采用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調(diào)用getBean()),才對該Bean進行加載實例化。這樣,我們就不能發(fā)現(xiàn)一些存在的Spring的配置問題。如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調(diào)用getBean方法才會拋出異常。②ApplicationContext,它是在容器啟動時,一次性創(chuàng)建了所有的Bean。這樣,在容器啟動時,我們就可以發(fā)現(xiàn)Spring中存在的配置錯誤,這樣有利于檢查所依賴屬性是否注入。?ApplicationContext啟動后預(yù)載入所有的單實例Bean,通過預(yù)載入單實例bean ,確保當(dāng)你需要的時候,你就不用等待,因為它們已經(jīng)創(chuàng)建好了。③ApplicationContext 唯一的不足是占用內(nèi)存空間。當(dāng)應(yīng)用程序配置Bean較多時,程序啟動較慢。(3)BeanFactory通常以編程的方式被創(chuàng)建。
ApplicationContext還能以聲明的方式創(chuàng)建,如使用ContextLoader。(4)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區(qū)別是:BeanFactory需要手動注冊,而ApplicationContext則是自動注冊。 ?
- Spring Bean 的生命周期?
首先說一下Servlet的生命周期:實例化,初始init,接收請求service,銷毀destroy;Spring上下文中的Bean生命周期也類似,如下:(1)實例化Bean:對于BeanFactory容器,當(dāng)客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調(diào)用createBean進行實例化。對于ApplicationContext容器,當(dāng)容器啟動結(jié)束后,通過獲取BeanDefinition對象中的信息,實例化所有的bean。(2)設(shè)置對象屬性(依賴注入):實例化后的對象被封裝在BeanWrapper對象中,緊接著,Spring根據(jù)BeanDefinition中的信息 以及 通過BeanWrapper提供的設(shè)置屬性的接口完成依賴注入。(3)處理Aware接口:接著,Spring會檢測該對象是否實現(xiàn)了xxxAware接口,并將相關(guān)的xxxAware實例注入給Bean:①如果這個Bean已經(jīng)實現(xiàn)了BeanNameAware接口,會調(diào)用它實現(xiàn)的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;②如果這個Bean已經(jīng)實現(xiàn)了BeanFactoryAware接口,會調(diào)用它實現(xiàn)的setBeanFactory()方法,傳遞的是Spring工廠自身。③如果這個Bean已經(jīng)實現(xiàn)了ApplicationContextAware接口,會調(diào)用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;(4)BeanPostProcessor:如果想對Bean進行一些自定義的處理,那么可以讓Bean實現(xiàn)了BeanPostProcessor接口,那將會調(diào)用postProcessBeforeInitialization(Object obj, String s)方法。由于這個方法是在Bean初始化結(jié)束時調(diào)用的,所以可以被應(yīng)用于內(nèi)存或緩存技術(shù);(5)InitializingBean 與 init-method:如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調(diào)用其配置的初始化方法。(6)如果這個Bean實現(xiàn)了BeanPostProcessor接口,將會調(diào)用postProcessAfterInitialization(Object obj, String s)方法;以上幾個步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了,之后就可以使用這個Bean了。(7)DisposableBean:當(dāng)Bean不再需要時,會經(jīng)過清理階段,如果Bean實現(xiàn)了DisposableBean這個接口,會調(diào)用其實現(xiàn)的destroy()方法;(8)destroy-method:最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調(diào)用其配置的銷毀方法。 ?
轉(zhuǎn)載于:https://www.cnblogs.com/strong-FE/p/11383584.html
總結(jié)
以上是生活随笔為你收集整理的Spring基础面试题(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 27级12w有救没
- 下一篇: Linux tcpdump命令详解与Wi