【spring相关面试题摘录】
- 什么是bean的自動(dòng)裝配,有哪些方式?
- Spring Boot、Spring MVC 和 Spring 有什么區(qū)別
- 如何重新加載Spring Boot 上的更改,而無(wú)需重新啟動(dòng)服務(wù)器?
- Spring Boot 中的監(jiān)視器是什么?
- 談?wù)勀銓?duì)AOP的理解
- 對(duì)IOC的理解
- 簡(jiǎn)述spring的生命周期
什么是bean的自動(dòng)裝配,有哪些方式?
開(kāi)啟自動(dòng)裝配,只需要在xml配置文件中定義“autowire”屬性。
autowire屬性有五種裝配的方式:
no – 缺省情況下,自動(dòng)配置是通過(guò)“ref”屬性手動(dòng)設(shè)定 。
byName-根據(jù)bean的屬性名稱(chēng)進(jìn)行自動(dòng)裝配。
byType-根據(jù)bean的類(lèi)型進(jìn)行自動(dòng)裝配。
Cutomer的屬性person的類(lèi)型為Person,Spirng會(huì)將Person類(lèi)型通過(guò)setter方法進(jìn)行自動(dòng)裝配。 <bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="byType"/> <bean id="person" class="com.xxx.xxx.Person"/>constructor-類(lèi)似byType,不過(guò)是應(yīng)用于構(gòu)造器的參數(shù)。如果一個(gè)bean與構(gòu)造器參數(shù)的類(lèi)型形同,則進(jìn)行自動(dòng)裝配,否則導(dǎo)致異常。
autodetect-如果有默認(rèn)的構(gòu)造器,則通過(guò)constructor方式進(jìn)行自動(dòng)裝配,否則使用byType方式進(jìn)行自動(dòng)裝配。
@Autowired自動(dòng)裝配bean,可以在字段、setter方法、構(gòu)造函數(shù)上使用。
手動(dòng)裝配:以value或ref的方式明確指定屬性值都是手動(dòng)裝配。
需要通過(guò)‘ref’屬性來(lái)連接bean。
Cutomer的屬性名稱(chēng)是person,Spring會(huì)將bean id為person的bean通過(guò)setter方法進(jìn)行自動(dòng)裝配。
@Autowired自動(dòng)裝配bean,可以在字段、setter方法、構(gòu)造函數(shù)上使用。
Spring Boot、Spring MVC 和 Spring 有什么區(qū)別
Spring是一個(gè)輕量級(jí)的使用控制反轉(zhuǎn)(IoC)和面向切面(AOP)的J2EE容器框架,用來(lái)管理Bean
–從大小與開(kāi)銷(xiāo)兩方面而言Spring都是輕量級(jí)的。
–通過(guò)控制反轉(zhuǎn)(IoC)的技術(shù)達(dá)到松耦合的目的
–提供了面向切面編程的豐富支持,允許通過(guò)分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)進(jìn)行內(nèi)聚性的開(kāi)發(fā)
–包含并管理應(yīng)用對(duì)象(Bean)的配置和生命周期,這個(gè)意義上是一個(gè)容器。
–將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用,這個(gè)意義上是一個(gè)框架
spring可以很方便的整合各種框架,提供AOP機(jī)制彌補(bǔ)OOP的代碼重復(fù)問(wèn)題、更方便將不同類(lèi)不同方法中的共同處理抽取成切面、自動(dòng)注入給方法執(zhí)行,比如日志、異常等
springmvc是spring對(duì)web框架的一個(gè)解決方案,提供了一個(gè)總的前端控制器Servlet,用來(lái)接收請(qǐng)求,然后定義了一套路由策略(url到handle的映射)及適配執(zhí)行handle,將handle結(jié)果使用視圖解析技術(shù)生成視圖展現(xiàn)給前端
springboot是spring提供的一個(gè)快速開(kāi)發(fā)工具包,讓程序員能更方便、更快速的開(kāi)發(fā)spring+springmvc應(yīng)用,簡(jiǎn)化了配置(約定了默認(rèn)配置),整合了一系列的解決方案(starter機(jī)制)、redis、mongodb、es,可以開(kāi)箱即用
Spring Boot 已經(jīng)建立在現(xiàn)有spring 框架之上。使用spring 啟動(dòng),我們避免了之前我們必須做的所有樣板代碼和配置。因
此, Spring Boot 可以幫助我們以最少的工作量, 更加健壯地使用現(xiàn)有的Spring功能。
Spring Boot 的優(yōu)點(diǎn)有:
1、減少開(kāi)發(fā),測(cè)試時(shí)間和努力。
2、使用JavaConfig 有助于避免使用XML。
3、避免大量的Maven 導(dǎo)入和各種版本沖突。
4、提供意見(jiàn)發(fā)展方法。
5、通過(guò)提供默認(rèn)值快速開(kāi)始開(kāi)發(fā)。
6、沒(méi)有單獨(dú)的Web 服務(wù)器需要。這意味著你不再需要啟動(dòng)Tomcat,Glassfish
或其他任何東西。
7、需要更少的配置因?yàn)闆](méi)有web.xml 文件。只需添加用@ Configuration 注釋的類(lèi),然后添加用@Bean 注釋的方法,Spring 將自動(dòng)加載對(duì)象并像以前一樣對(duì)其進(jìn)行管理。您甚至可以將@Autowired 添加到bean 方法中,以使Spring 自動(dòng)裝
入需要的依賴(lài)關(guān)系中。
8、基于環(huán)境的配置使用這些屬性,您可以將您正在使用的環(huán)境傳遞到應(yīng)用程序:
-Dspring.profiles.active = {enviornment}。在加載主應(yīng)用程序?qū)傩晕募?#xff0c;
Spring 將在(application{environment} .properties)中加載后續(xù)的應(yīng)用程序?qū)傩晕募?/p>
如何重新加載Spring Boot 上的更改,而無(wú)需重新啟動(dòng)服務(wù)器?
這可以使用DEV 工具來(lái)實(shí)現(xiàn)。通過(guò)這種依賴(lài)關(guān)系,您可以節(jié)省任何更改,嵌入式tomcat 將重新啟動(dòng)。Spring Boot 有一個(gè)開(kāi)發(fā)工具(DevTools)模塊,它有助于提高開(kāi)發(fā)人員的生產(chǎn)力。Java 開(kāi)發(fā)人員面臨的一個(gè)主要挑戰(zhàn)是將文件更改自動(dòng)部署到服務(wù)器并自動(dòng)重啟服務(wù)器。開(kāi)發(fā)人員可以重新加載Spring Boot 上的更改,而無(wú)需重新啟動(dòng)服務(wù)器。這將消除每次手動(dòng)部署更改的需要。Spring Boot 在發(fā)布它的第一個(gè)版本時(shí)沒(méi)有這個(gè)功能。這是開(kāi)發(fā)人員最需要的功能。DevTools 模塊完全滿足開(kāi)發(fā)人員的需求。該模塊將在生產(chǎn)環(huán)境中被禁用。它還提供H2 數(shù)據(jù)庫(kù)控制臺(tái)以更好地測(cè)試應(yīng)用程序
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional>Spring Boot 中的監(jiān)視器是什么?
Spring boot actuator 是spring 啟動(dòng)框架中的重要功能之一。Spring boot 監(jiān)視器可幫助您訪問(wèn)生產(chǎn)環(huán)境中正在運(yùn)行的應(yīng)用程序的當(dāng)前狀態(tài)。有幾個(gè)指標(biāo)必須在生產(chǎn)環(huán)境中進(jìn)行檢查和監(jiān)控。即使一些外部應(yīng)用程序可能正在使用這些服務(wù)來(lái)向
相關(guān)人員觸發(fā)警報(bào)消息。監(jiān)視器模塊公開(kāi)了一組可直接作為HTTP URL 訪問(wèn)的REST 端點(diǎn)來(lái)檢查狀態(tài)
談?wù)勀銓?duì)AOP的理解
系統(tǒng)是由許多不同的組件所組成的,每一個(gè)組件各負(fù)責(zé)一塊特定功能。除了實(shí)現(xiàn)自身核心功能之外,這些組件還經(jīng)常承擔(dān)著額外的職責(zé)。例如日志、事務(wù)管理和安全這樣的核心服務(wù)經(jīng)常融入到自身具有核心業(yè)務(wù)邏輯的組件中去。這些系統(tǒng)服務(wù)經(jīng)常被稱(chēng)為橫切關(guān)注點(diǎn),因?yàn)樗鼈儠?huì)跨越系統(tǒng)的多個(gè)組件。
當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候,OOP則顯得無(wú)能為力。也就是說(shuō),OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日志代碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無(wú)關(guān)系。
在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。
AOP:將程序中的交叉業(yè)務(wù)邏輯(比如安全,日志,事務(wù)等),封裝成一個(gè)切面,然后注入到目標(biāo)對(duì)象(具體業(yè)務(wù)邏輯)中去。AOP可以對(duì)某個(gè)對(duì)象或某些對(duì)象的功能進(jìn)行增強(qiáng),比如對(duì)象中的方法進(jìn)行增強(qiáng),可以在執(zhí)行某個(gè)方法之前額外的做一些事情,在某個(gè)方法執(zhí)行之后額外的做一些事情
1.應(yīng)用場(chǎng)景 AOP適合的場(chǎng)景很多,包括:
·日志記錄:不需要在邏輯代碼中混雜日志代碼,在項(xiàng)目后期織入日志功能。可以織入的日志包括系統(tǒng)登錄日志、服務(wù)及方法調(diào)用日志等。
·安全控制:對(duì)系統(tǒng)的訪問(wèn)進(jìn)行登錄驗(yàn)證,對(duì)請(qǐng)求進(jìn)行權(quán)限驗(yàn)證。
·參數(shù)檢驗(yàn):對(duì)請(qǐng)求參數(shù)進(jìn)行統(tǒng)一轉(zhuǎn)換或驗(yàn)證。 ·事務(wù)處理:統(tǒng)一處理數(shù)據(jù)庫(kù)事務(wù)的提交和回滾,比如在方法執(zhí)行完成后自動(dòng)提交事務(wù),出現(xiàn)異常時(shí)自動(dòng)回滾。
·統(tǒng)一異常處理:不需要在每個(gè)方法中使用try catch捕捉異常,使用AOP集中處理。
·緩存:使用AOP實(shí)現(xiàn)緩存存取和清除。
·統(tǒng)一發(fā)信、通知,對(duì)某些方法執(zhí)行或者異常攔截發(fā)送通知。 橫向共用功能通過(guò)AOP實(shí)現(xiàn)后, 業(yè)務(wù)邏輯代碼變得干凈、整潔。
2. AOP的基本術(shù)語(yǔ)解釋如下:
·Aspect:切面,由切點(diǎn)和增強(qiáng)組成,如在Java代碼中對(duì)應(yīng)一個(gè)切面類(lèi)。
·JointPoint:連接點(diǎn)。程序執(zhí)行的某個(gè)位置,如函數(shù)調(diào)用、函數(shù)執(zhí)行、構(gòu)造函數(shù)調(diào)用、獲取或設(shè)置變量、類(lèi)初始化等。 ·Pointcut:切入點(diǎn),也就是特定的連接點(diǎn)。一個(gè)程序有多個(gè)連接點(diǎn),但并不是所有連接點(diǎn)都是需要關(guān)心的,找到合適的連接點(diǎn)進(jìn)行切入。切入點(diǎn)就是選取的合適連接點(diǎn)的描述。一句話,Pointcut用來(lái)限定和描述JointPoint。
·Advice:增強(qiáng)。織入到目標(biāo)連接點(diǎn)的代碼,也就是額外功能的代碼。
·Weaving:織入。將增強(qiáng)添加到目標(biāo)連接點(diǎn)的過(guò)程。
·Before(前置)、After(后置)和Around(環(huán)繞):織入方位可前、 可后也可以是兩者的合集。 代理(Proxy)是實(shí)現(xiàn)AOP的主要技術(shù),在代理類(lèi)中包含了原始類(lèi)和增強(qiáng)代碼的功能。
【關(guān)鍵詞:增強(qiáng),代理】
對(duì)IOC的理解
談?wù)勀銓?duì)IOC的理解
容器概念、控制反轉(zhuǎn)、依賴(lài)主入
ioc容器:實(shí)際上就是個(gè)map(key, value)),里存的是各種對(duì)象(在xm里配置的bean節(jié)點(diǎn)、@ repository.@ service…@ controller.@ component)),在項(xiàng)目啟動(dòng)的時(shí)候會(huì)讀取配置文件里面的bean節(jié)點(diǎn),根據(jù)全限定類(lèi)名使用反射創(chuàng)建對(duì)象放到map里、掃描到打上上述注解的類(lèi)還是通過(guò)反射創(chuàng)建對(duì)象放到map里,這個(gè)時(shí)候map里就有各種對(duì)象了,接下來(lái)我們?cè)诖a里需要用到里面的對(duì)象時(shí),再通過(guò)DI注入( autowired、resource等注解,xml里bean節(jié)點(diǎn)內(nèi)的ref屬性,項(xiàng)目啟動(dòng)的時(shí)候會(huì)讀取xml節(jié)點(diǎn)ref屬性根據(jù)id注入,也會(huì)掃描這些注解,根據(jù)類(lèi)型或id注入;id就是對(duì)象名)。
控制反轉(zhuǎn):
沒(méi)有引入IOC容器之前,對(duì)象A依賴(lài)于對(duì)象B.那么對(duì)象A在初始化或者運(yùn)行到某一點(diǎn)的時(shí)候,自己必須主動(dòng)去創(chuàng)建對(duì)象B或者使用已經(jīng)創(chuàng)建的對(duì)象B。無(wú)論是創(chuàng)建還使用對(duì)象B,控制權(quán)都在自己手上。
引入IOC容器之后,對(duì)象A與對(duì)象B之間失去了直接聯(lián)系,當(dāng)對(duì)象A運(yùn)行到需要對(duì)象B的時(shí)候,IOC容器會(huì)主動(dòng)創(chuàng)建一個(gè)對(duì)象B注入到對(duì)象A需要的地方通過(guò)前后的對(duì)比,不難看出來(lái):對(duì)象A獲得依賴(lài)象B的過(guò)程由主動(dòng)行為變?yōu)榱吮粍?dòng)行為,控制權(quán)順倒過(guò)來(lái)了,這就是控制反轉(zhuǎn)這個(gè)名稱(chēng)的由來(lái)。
全部對(duì)象的控制權(quán)全部上繳給第三方IOC容器,所以,IOC容器成了整個(gè)系統(tǒng)的關(guān)鍵核心,它起到了一種類(lèi)似粘合劑的作用,把系統(tǒng)中的所有對(duì)象粘合在一起揮作用,如果沒(méi)有這個(gè)粘合劑,對(duì)象與對(duì)象之間會(huì)彼此失去聯(lián)系,這就是有人把IOC容器比喻成粘合劑的由來(lái)。
依賴(lài)注入:“獲得依賴(lài)對(duì)象的過(guò)程被反轉(zhuǎn)了”,控制反轉(zhuǎn)之后,獲得依賴(lài)對(duì)象的過(guò)程由自身管理變成了由IOC容器管理,依賴(lài)注入是實(shí)現(xiàn)IOC的方法,就是由IOC容器在運(yùn)行期間,動(dòng)態(tài)地將某種依賴(lài)關(guān)系注入到對(duì)象之中。
簡(jiǎn)述spring的生命周期
1、解析類(lèi)得到 BeanDefinition
2、如果有多個(gè)構(gòu)造方法,則要推斷構(gòu)造方法
3、確定好構(gòu)造方法后,進(jìn)行實(shí)例化得到一個(gè)對(duì)象
4、對(duì)對(duì)象中的加了@ Autowired注解的屬性進(jìn)行屬性填充
5、回調(diào) Aware方法,比如 BeanNameAware, BeanFactoryAware
6、調(diào)用 BeanPostProcessor的初始化前的方法
7、調(diào)用初始化方法
8、調(diào)用 BeanPostProcessorg的初始化后的方法,在這里會(huì)進(jìn)行AOP
9、如果當(dāng)前創(chuàng)建的bean是單例的則會(huì)把bean放入單例池
10、使用bean
11、 Spring容器關(guān)閉時(shí)調(diào)用中 destory)方法
總結(jié)
以上是生活随笔為你收集整理的【spring相关面试题摘录】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【java学习笔记】java se8的流
- 下一篇: 【数据结构】用java实现不同的七种排序