Spring相關問題

1.什么是Spring框架坯汤?

Spring是一個輕量級的java開源框架窒升,為了解決企業(yè)級應用開發(fā)的復雜性創(chuàng)建的java開發(fā)平臺奈附,其核心是為了簡化java開發(fā)缚够,為了簡化java開發(fā)隔缀,Spring采取以下四種策略:

  1. 基于pojo的輕量級和最小入侵式編程题造。
  2. 通過依賴注入和面向接口編程實現(xiàn)松耦合
  3. 基于切面實現(xiàn)聲明式編程
  4. 通過切面和模板減少樣板式代碼

2.Spring框架有哪些主要的模塊?

  1. Spring IOC : Spring的核心模塊猾瘸,包含了最基本的IoC容器BeanFactory的接口和實現(xiàn)界赔,IOC容器的高級使用行態(tài)ApplicationContext應用上下文供用戶使用丢习。
  2. Spring Aop: Spring的核心模塊,圍繞著AOP的增強功能淮悼,Spring集成了Aspectj作為AOP的一個特定實現(xiàn)咐低,同時還基于jdk動態(tài)代理(代理對象有接口的時候)/CGLIB(字節(jié)碼生成的開源類庫,代理對象沒接口的時候)的基礎上敛惊,實現(xiàn)了一個AOP框架渊鞋。
  3. Spring MVC : 以DispatcherServlet為核心,實現(xiàn)了MVC模式瞧挤,包括怎么樣與WEB容器環(huán)境的集成锡宋,web請求的分發(fā),攔截特恬,處理和ModelAndView數(shù)據(jù)的返回执俩,以及如何集成各種UI視圖展現(xiàn)和數(shù)據(jù)表現(xiàn)。
  4. Spring jdbc/Spring ORM :Spring 對jdbc做了一層封裝癌刽,提供了JdbcTemplate作為模板類役首,Spring提供了許多對ORM工具的封裝。
  5. Spring 事務處理:Spring事務處理是使用Spring aop對功能進行增強的模塊显拜,提供IOC容器讀入配置衡奥。

3.什么是控制反轉(zhuǎn)?什么是依賴注入远荠?

控制反轉(zhuǎn)也稱為依賴倒置原則矮固,如果對象之間的依賴關系由具體的對象來完成,那么將要導致代碼的高度耦合和可測試性降低譬淳,如果把對象的依賴關系交給Ioc容器或者框架來完成档址,把具體的控制權(quán)交給平臺或者框架來處理,將會降低面向?qū)ο笙到y(tǒng)設計的復雜性和提高系統(tǒng)的可測試性邻梆,控制反轉(zhuǎn)是指一個對象如何獲取它所依賴的對象的引用守伸,反轉(zhuǎn)是指責任的反轉(zhuǎn)。

4.Spring IOC 應用場景

Spring中浦妄,Spring IOC 提供了JavaBean容器尼摹,通過IOC模式管理依賴關系,并通過依賴注入和AOP切面增強了為JavaBean這樣的POJO對象賦予了事務管理等基本功能剂娄,使用IOC容器窘问,把資源獲取的方向反轉(zhuǎn),讓IOC容器主動管理這些依賴關系宜咒,將這些依賴關系注入到組件中,那么會讓這些依賴關系的適配和管理更加靈活把鉴,有三種注入方式:

  • 接口注入
  • setter注入
  • 構(gòu)造器注入

5.BeanFactory和ApplicationContext的區(qū)別

在Spring容器中主要有兩個系列的基本容器故黑,一個是實現(xiàn)BeanFactory接口的簡單系列容器儿咱,這個容器只實現(xiàn)了最基本容器功能;另一個是ApplicationContext應用上下文场晶,它作為容器的高級形態(tài)而混埠,這個容器在簡單容器的基礎上增加了許多面向框架的特性。
ApplicationContext容器提供了BeanFactory不具備的新特性:

  • 支持不同的信息源诗轻。
  • 訪問資源钳宪。
  • 支持應用事件。
  • 在ApplicationContext提供附加服務扳炬。
    幾種應用上下文(IoC容器):
    1.AnnotationConfigApplicationContext:從一個或多個基于java配置類中加載Spring應用上下文吏颖,加載bean,然后包裝成BeanDefinition恨樟。
    2.AnnotationConfigWebApplicationContext:從一個或多個基于java配置類中加載Spring Web應用上下文半醉,加載bean。
    3.ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載Spring應用上下文劝术。
    4.FileSystemXmlApplicationContext:從文件系統(tǒng)下的一個或多個XML配置文件中加載上下文定義缩多。
    5.XmlWebApplicationContext:從web應用下的一個或多個xml配置文件中加載上下文定義。

6. Spring的配置方式

1.基于xml配置养晋。
2.基于注解的配置
3.基于java類的配置

7.如何使用基于xml配置的方式配置Spring

使用xml文件配置衬吆,bean標簽。

8.如何適應基于java類的方式配置Spring

對于java配置類加上@Configration注解绳泉,對于pojo加上@Bean注解逊抡。

9.如何使用基于注解的方式配置Spring

這種方式也叫做自動化裝配(應用組件之間的協(xié)作),Spring從兩個角度實現(xiàn)自動化裝配
1.組件掃描:Spring會自動發(fā)現(xiàn)應用上下文所創(chuàng)建的bean
為pojo加上@Component注解圈纺,表明它是一個java bean秦忿。在通過@ComponnentScan注解來開啟組件掃描(java 類配置的方式@Configuration注解)或者xml文件,默認會掃描與配置類相同的包蛾娶。
如何設置掃描的基礎包:@ComponentScan(basesPackage={"包名","包名"})

2.自動裝配:Spring自動滿足bean之間的依賴灯谣。
讓Spring自動滿足bean依賴的一種方法,可以使用@Autowired注解進行自動裝配蛔琅。

10.Spring bean的生命周期(bean的創(chuàng)建過程)

  • Spring對bean進行實例化
  • Spring將值和bean引用注入到bean對應的屬性中
  • 如果bean實現(xiàn)了BeanNameAware接口胎许,Spring將bean的id傳給setBeanName()方法
  • 如果bean實現(xiàn)了BeanFactoryAware接口,Spring將調(diào)用setBeanFactory()方法罗售,將BeanFactory傳入
  • 如果bean實現(xiàn)了ApplicationContextAware接口辜窑,Spring將調(diào)用setApplicationContext()方法,將bean所在的應用上下文的引用傳入進來寨躁。
  • 如果bean實現(xiàn)了BeanPostProcessor接口穆碎,Spring將調(diào)用它們的postProcessBeforeInitialization()方法。
  • 如果bean實現(xiàn)了InitializingBean接口职恳,Spring將調(diào)用它們的postProcessAfterInitialization()方法所禀。
  • 此時bean已經(jīng)準備就緒方面,可以被應用程序所使用了,它們將一直駐留在應用上下文中色徘,直到該應用上下文被銷毀恭金。

11.Spring bean的作用域

在默認情況下Spring IOC容器中的所有bean都是以單例形式創(chuàng)建的,改變bean作用域可以使用@Scope注解來改變褂策。xml 中 <scope = "prototype">

  • 單例:在整個應用中横腿,只創(chuàng)建bean的一個實例。
  • 原型:每次注入或者通過Spring應用上下文獲取的時候斤寂,都會創(chuàng)建一個bean實例耿焊。
  • 會話:在web應用中,為每個會話創(chuàng)建一個bean實例扬蕊。
  • 請求:在web應用中搀别,為每個請求創(chuàng)建一個bean實例。

12.Spring用到哪些設計模式

單例模式 --- bean加載默認單例
代理模式 -- AOP
工廠模式 --- Ioc容器BeanFactory就是使用工廠模式
模板方法模式 --- 封裝jdbc的方法尾抑,jdbcTemplate
控制反轉(zhuǎn)模式 --- Spring核心Ioc的生成歇父。

13.Spring 如何實現(xiàn)IoC

Spring有兩種類型的容器BeanFactory和ApplicationContext,
使用Ioc容器時的幾個步驟:

  • 創(chuàng)建IoC配置文件的抽象資源再愈,這個抽象資源包含了BeanDefinition的定義信息榜苫。
  • 創(chuàng)建一個BeanFactory
  • 創(chuàng)建一個BeanDefinition的讀取器,這里使用XmlBeanDefinitionReader來載入XML文件形式的BeanDefinition
  • 從定義好的資源位置讀取配置信息翎冲,具體的解析過程由XmlBeanDefinitionReader來完成垂睬。完成整個載入和注冊Bean定義之后,需要的IoC容器就建立起來了抗悍。

IoC容器的實現(xiàn)過程:

第一步:IoC容器的初始化驹饺,這個過程包括BeanDefinition的Resource定位,載入和注冊三個基本過程缴渊。

  • 定位:BeanDefinition的資源定位赏壹。
  • BeanDefinition的載入過程,這個載入是指把用戶定義好的Bean表示成IoC容器的內(nèi)部數(shù)據(jù)結(jié)構(gòu)BeanDefinition衔沼。
  • 向IoC容器中注冊這些BeanDefinition的過程蝌借,就是將BeanDefinition注入到一個HashMap中去,IoC容器就是通過這個HashMap來持有這些BeanDefinition數(shù)據(jù)的指蚁。

第二步:IoC容器的依賴注入
getBean()方法是依賴注入的起點菩佑,Bean對象會依據(jù)BeanDefinition定義的要求生成,提供了兩種實例化java對象的方法凝化,一種通過JVM的反射功能稍坯,一種通過前面提到的CGLIB來生成。其依賴關系在BeanDefinition中搓劫。

14.Spring如何實現(xiàn)AOP

AOP面向切面編程劣光,Spring提供了兩種AOP實現(xiàn):Spring AOP + AspectJ.
第一步:創(chuàng)建AopProxy代理對象袜蚕,代理對象的生成有兩種生成過程,
1.使用JDK的動態(tài)代理绢涡。
2.使用字節(jié)碼生成器CGLIB生成。
如果目標對象是接口類遣疯,則采用JDK動態(tài)代理方式生成,否則使用CGLIB來生成雄可。
第二步:對調(diào)用方法進行攔截,當代理對象的暴露的方法被調(diào)用時缠犀,首先會對這些方法調(diào)用進行攔截数苫,攔截過程在JDK的Proxy代理對象中,是通過invoke方法來完成的辨液,在CGLIB的Proxy代理對象中虐急,攔截是由設置好的回調(diào)callback來完成的。

15.Spring 中bean的創(chuàng)建過程

Spring bean實例化滔迈,然后調(diào)用一系列的生命周期方法完成bean的創(chuàng)建止吁,默認是以單例模式創(chuàng)建的,原型燎悍,會話敬惦,請求模式。

16.Spring bean的加載機制

Spring中的IoC容器來加載bean谈山,有兩種類型的IoC容器俄删,BeanFactory,ApplicationContext奏路。
首先畴椰,初始化IoC容器,就是定位鸽粉,載入和注冊BeanDefinition斜脂,就是在容器內(nèi)部維持一個hashmap裝載BeanDefinition。然后對IoC容器進行依賴注入潜叛,bean對象會根據(jù)BeanDefinition的要求生成秽褒,通過了兩種實例化java對象的方法,JVM反射和CGLIB.

17.Spring MVC是什么威兜?

Spring是一個java軟件開發(fā)平臺销斟,提供IoC AOP 事務處理 持久化等功能,Spring MVC是未用戶開發(fā)web應用提供支持椒舵。

18.Spring IOC容器是怎么樣在web環(huán)境中發(fā)揮作用的蚂踊?

Spring MVC是建立在IOC容器基礎上的,因此要先啟動ioc容器笔宿,啟動過程如下:
從servlet事件中得到ServletContext犁钟,然后通過讀取web.xml中的配置文件棱诱,
ContextLoaderListener被定義為一個監(jiān)聽器,這個監(jiān)聽器是與web服務器生命周期相關聯(lián)的涝动,因為ContextLoaderListener 實現(xiàn)ServletContextListener接口迈勋,這個接口監(jiān)聽ServletContext事件,然后調(diào)用ContextLoader初始化Ioc容器醋粟。

19.Spring MVC的過程靡菇?

Spring MVC的核心是DispatcherServlet,DispatcherServlet繼承HttpServlet米愿,DispatcherSevlet的工作主要有兩個厦凤,
1.DispatcherServlet的啟動和初始化,DispatcherServlet的啟動過程是和Servlet的啟動過程相聯(lián)系的育苟,Servlet初始化時其init方法會被調(diào)用较鼓,DispatcherServlet的初始化過程由其基類的HttpServletBean完成,接著會執(zhí)行DispatcherServlet的持有的IoC容器的初始化過程违柏,初始化時一個新的上下文被建立起來博烂,這個上下文被設置為根上下文的子上下文,和Servlet對應的一個上下文勇垛。DispatcherServlet會初始化HandlerMapping和ViewResolver脖母,默認使用的HandlerMapping是BeanNameUrlHandlerMapping

  • 對HTTP請求進行響應:在初始化完成之后,上下文環(huán)境已經(jīng)定義的HandlerMapping已經(jīng)被加載了闲孤,這些加載的HandlerMapping被放到一個List中谆级,這個List中的每一個元素對應著一個具體的HandlerMapping得配置,每個HandlerMapping持有一系列的從url到Controller的映射讼积,通過HandlerMapping接口類的getHandler()方法肥照,可以獲得與HTTP請求對應的HandlerExecutionChain,這個HandlerExecutionChain它有一個Inteceptor鏈和一個Controller對象.
    Spring MVC的執(zhí)行步驟
  • 建立Controller對象和HTTP請求之間的映射關系,這個工作是由HandlerMapping中封裝的HandlerExecutionChain對象來完成的勤众,對Controller對象和URL的映射關系式在配置bean中描述的舆绎,并在IOC容器(WebApplicationContext)中初始化,這些映射關系會被放入到hashmap中们颜。
  • 在mvc框架接受http請求之后吕朵,會在handlermapping中進行查詢,從而得到對應的HandlerExecutionChain,這個HandlerExecutionChain封裝了配置的Controller對象窥突,這個Controller對象會完成的請求的響應動作努溃,生成需要的ModelAndView對象
  • 得到ModelAndView以后,DispatcherServlet會把模型數(shù)據(jù)交給特定的視圖對象阻问。

20.Spring支持事物梧税,如何管理?

Spring事務處理模塊是通過AOP功能來實現(xiàn)聲明式事務處理的,通過TransactionProxyFactoryBean可以生成Proxy代理對象第队,在這個代理對象中哮塞,通過TransactionInterceptor來完成代理方法的攔截,將事務處理的功能編織進來凳谦,在實現(xiàn)聲明式事務處理時是AOP和IOC模塊集成的部分忆畅,對于具體的事務處理實現(xiàn),比如事務的生成尸执,提交邻眷,掛起,回滾剔交,對于不同的數(shù)據(jù)庫處理方式做了一個抽象和適配,適配的具體事務處理器包括改衩,對DataSource數(shù)據(jù)源的事務處理支持岖常,對Hibernate數(shù)據(jù)源的事務處理支持等。

21.Spring Dao那種設計模式用的最多葫督?

模板方法設計模式竭鞍,JdbcTemplate就是Spring對jdbc進行封裝的數(shù)據(jù)庫操作的類。

22.Spring MVC用過哪些注解橄镜?

@Controoler ---- 定義這個pojo是Controller
@Autowired ---- 注入這個對象
@RequestMapping --- 定義url映射關系
@SessionAttributes --- 設置會話對象
@ResponseBody --- 響應體
@Transactional --- 對數(shù)據(jù)庫操作做事務處理

23.Spring AOP 場景和底層實現(xiàn)?

事務處理偎快,日志打印就是一個典型的aop應用,生成代理對象AopProxy然后對調(diào)用方法進行攔截洽胶,從而實現(xiàn)對目標對象的增強晒夹,生成AopProxy的過程由兩種,當代理對象實現(xiàn)接口時丐怯,使用jdk動態(tài)代理,當沒有接口時使用CGLIB來生成字節(jié)碼文件翔横,cglib底層采用的是對ASM,ASM是一個可以動態(tài)修改已經(jīng)編譯過的class文件或者是動態(tài)生成新的java class禾唁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荡短,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肢预,老刑警劉巖矛洞,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡沼本,警方通過查閱死者的電腦和手機噩峦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抽兆,“玉大人识补,你說我怎么就攤上這事”韬欤” “怎么了凭涂?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贴妻。 經(jīng)常有香客問我切油,道長,這世上最難降的妖魔是什么名惩? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任澎胡,我火速辦了婚禮,結(jié)果婚禮上娩鹉,老公的妹妹穿的比我還像新娘攻谁。我一直安慰自己,他們只是感情好弯予,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布戚宦。 她就那樣靜靜地躺著,像睡著了一般锈嫩。 火紅的嫁衣襯著肌膚如雪受楼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天祠挫,我揣著相機與錄音那槽,去河邊找鬼。 笑死等舔,一個胖子當著我的面吹牛骚灸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慌植,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼甚牲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝶柿?” 一聲冷哼從身側(cè)響起丈钙,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎交汤,沒想到半個月后雏赦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫笙,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年填大,在試婚紗的時候發(fā)現(xiàn)自己被綠了俏橘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡靴寂,死狀恐怖召耘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情收壕,我是刑警寧澤轨蛤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布祥山,位于F島的核電站掉伏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏供常。R本人自食惡果不足惜鸡捐,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一箍镜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧香缺,春花似錦、人聲如沸图张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讲仰。三九已至痪蝇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趁矾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工毫捣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔓同,地道東北人蹲诀。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓脯爪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痕慢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)塔次,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架恭取。Spring框架的核心功能可以應用在任何Jav...
    jemmm閱讀 16,445評論 1 133
  • 從三月份找實習到現(xiàn)在蜈垮,面了一些公司,掛了不少攒发,但最終還是拿到小米、百度惠猿、阿里、京東姜凄、新浪趾访、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,209評論 11 349
  • #幸福是需要修出來的~每天進步1%~幸福實修11班/15徐則蘭~杭州 20170919 【幸福三朵玫瑰】 今日3朵...
    徐則蘭閱讀 176評論 1 2
  • 瘦削的時間 劃過 在冬天 沒有飄雪 我也 感到了溫暖 所以 想要靠岸 只是 不安的心 還沒有回顧 便已經(jīng)轉(zhuǎn)身 我也...
    小熊y閱讀 206評論 2 3