更新時(shí)間:2021-05-08 10:03:59 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1130次
1.使用Spring框架的好處是什么?
輕量:Spring 是輕量的,基本的版本大約2MB。
控制反轉(zhuǎn):Spring通過控制反轉(zhuǎn)實(shí)現(xiàn)了松散耦合,對(duì)象們給出它們的依賴,而不是創(chuàng)建或查找依賴的對(duì)象們。
面向切面的編程(AOP):Spring支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開。
容器:Spring 包含并管理應(yīng)用中對(duì)象的生命周期和配置。
2.什么是Spring beans?
Spring beans 是那些形成Spring應(yīng)用的主干的java對(duì)象。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的元數(shù)據(jù)創(chuàng)建。比如,以XML文件中 的形式定義。
Spring 框架定義的beans都是單件beans。在bean tag中有個(gè)屬性”singleton”,如果它被賦為TRUE,bean 就是單件,否則就是一個(gè) prototype bean。默認(rèn)是TRUE,所以所有在Spring框架中的beans 缺省都是單件。
3.解釋Spring支持的幾種bean的作用域
Spring框架支持以下五種bean的作用域:
singleton : bean在每個(gè)Spring ioc 容器中只有一個(gè)實(shí)例。
prototype:一個(gè)bean的定義可以有多個(gè)實(shí)例。
request:每次http請(qǐng)求都會(huì)創(chuàng)建一個(gè)bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。
session:在一個(gè)HTTP Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
global-session:在一個(gè)全局的HTTP Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.
4.Spring框架中的單例bean是線程安全的嗎?
不,Spring框架中的單例bean不是線程安全的
5.spring 依賴注入方式
(1)Set注入
(2)構(gòu)造器注入
(3)靜態(tài)工廠的方法注入
(4)實(shí)例工廠的方法注入
6.AOP中的概念
面向切面:在運(yùn)行時(shí),動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程
7.常用注解:
• @aspect 定義切面
• @pointcut 定義切點(diǎn)
• @before 標(biāo)注Before Advice定義所在的方法
• @afterreturning 標(biāo)注After Returning Advice定義所在的方法
• @afterthrowing 標(biāo)注After Throwing Advice定義所在的方法
• @after 標(biāo)注 After(Finally) Advice定義所在的方法
• @around 標(biāo)注Around Advice定義所在的方法
Aspect(切面): 是通知和切入點(diǎn)的結(jié)合,通知和切入點(diǎn)共同定義了關(guān)于切面的全
部?jī)?nèi)容—它的功能、在何時(shí)和何地完成其功能
joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在spring中,這些點(diǎn)指的
是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn).
Pointcut(切入點(diǎn)):所謂切入點(diǎn)是指我們要對(duì)哪些joinpoint進(jìn)行攔截的定義.
通知定義了切面的”什么”和”何時(shí)”,切入點(diǎn)就定義了”何地”.
Advice(通知):所謂通知是指攔截到j(luò)oinpoint之后所要做的事情就是通知.通知分
為前置通知,后置通知,異常通知,最終通知,環(huán)繞通知(切面要完成的功能)
Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象
Weaving(織入):是指把切面應(yīng)用到目標(biāo)對(duì)象來創(chuàng)建新的代理對(duì)象的過程.切面在
指定的連接點(diǎn)織入到目標(biāo)對(duì)象
Introduction(引入):在不修改類代碼的前提下, Introduction可以在運(yùn)行期為類
動(dòng)態(tài)地添加一些方法或Field.
8.Spring中的AOP底層實(shí)現(xiàn)原理
動(dòng)態(tài)代理,照我的理解就是,在不修改原有類對(duì)象方法的源代碼基礎(chǔ)上,通過代理對(duì)象實(shí)現(xiàn)原有類對(duì)象方法的增強(qiáng),也就是拓展原有類對(duì)象的功能。
9.什么是Spring boot,Spring boot 有什么特性?
Spring boot 不是對(duì)Spring功能上的增強(qiáng),而是提供了一種快速使用Sping的方式
用來簡(jiǎn)化spring應(yīng)用的初始搭建以及開發(fā)過程 使用特定的方式來進(jìn)行配置(properties或yml文件)
創(chuàng)建獨(dú)立的spring引用程序 main方法運(yùn)行
嵌入的Tomcat 無需部署war文件
簡(jiǎn)化maven配置
自動(dòng)配置spring添加對(duì)應(yīng)功能starter自動(dòng)化配置
10.springboot常用的starter有哪些
spring-boot-starter-web 嵌入tomcat和web開發(fā)需要servlet與jsp支持
spring-boot-starter-data-jpa 數(shù)據(jù)庫(kù)支持
spring-boot-starter-data-redis redis數(shù)據(jù)庫(kù)支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成starter
11.springboot自動(dòng)配置的原理
在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration
會(huì)自動(dòng)去maven中讀取每個(gè)starter中的spring.factories文件 該文件里配置了所有需要被創(chuàng)建spring容器中的bean
12.什么是Spring cloud,Spring cloud有什么特性
Spring cloud 就是一套分布式服務(wù)治理的框架,它不會(huì)提供具體功能的操作,更專注于服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等等。
13.Spring boot 和Spring cloud 的區(qū)別
(1)Spring boot 是 Spring 的一套快速配置腳手架,可以基于spring boot 快速開發(fā)單個(gè)微服務(wù);Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具;
(2)Spring boot專注于快速、方便集成的單個(gè)個(gè)體,Spring Cloud是關(guān)注全局的服務(wù)治理框架;
(3)spring boot使用了默認(rèn)大于配置的理念,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot來實(shí)現(xiàn)。
(4)Spring boot可以離開Spring Cloud獨(dú)立使用開發(fā)項(xiàng)目,但是Spring Cloud離不開Spring boot,屬于依賴的關(guān)系。
14.Dubbo能做什么?
(1)透明化的遠(yuǎn)程方法調(diào)用,就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法,只需簡(jiǎn)單配置,沒有任何API侵入。
(2)軟負(fù)載均衡及容錯(cuò)機(jī)制,可在內(nèi)網(wǎng)替代F5等硬件負(fù)載均衡器,降低成本,減少單點(diǎn)。
(3)服務(wù)自動(dòng)注冊(cè)與發(fā)現(xiàn),不再需要寫死服務(wù)提供方地址,注冊(cè)中心基于接口名查詢服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者。
15.dubbo使用方法
Dubbo采用全Spring配置方式,透明化接入應(yīng)用,對(duì)應(yīng)用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴(kuò)展進(jìn)行加載。如果不想使用Spring配置,而希望通過API的方式進(jìn)行調(diào)用(不推薦)
Dubbo采用全Spring配置方式,透明化接入應(yīng)用,對(duì)應(yīng)用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴(kuò)展進(jìn)行加載。
16.Mybatis是如何進(jìn)行分頁(yè)的?分頁(yè)插件的原理是什么?
Mybatis使用RowBounds對(duì)象進(jìn)行分頁(yè),它是針對(duì)ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁(yè),而非物理分頁(yè),可以在sql內(nèi)直接書寫帶有物理分頁(yè)的參數(shù)來完成物理分頁(yè)功能,也可以使用分頁(yè)插件來完成物理分頁(yè)。
分頁(yè)插件的基本原理是使用Mybatis提供的插件接口,實(shí)現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql,然后重寫sql,根據(jù)dialect方言,添加對(duì)應(yīng)的物理分頁(yè)語(yǔ)句和物理分頁(yè)參數(shù)。
舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student)t limit 0,10
17.簡(jiǎn)述Mybatis的插件運(yùn)行原理,以及如何編寫一個(gè)插件。
Mybatis僅可以編寫針對(duì)ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動(dòng)態(tài)代理,為需要攔截的接口生成代理對(duì)象以實(shí)現(xiàn)接口方法攔截功能,每當(dāng)執(zhí)行這4種接口對(duì)象的方法時(shí),就會(huì)進(jìn)入攔截方法,具體就是InvocationHandler的invoke()方法,當(dāng)然,只會(huì)攔截那些你指定需要攔截的方法。
實(shí)現(xiàn)Mybatis的Interceptor接口并復(fù)寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個(gè)接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。
18.Mybatis動(dòng)態(tài)sql是做什么的?都有哪些動(dòng)態(tài)sql?能簡(jiǎn)述一下動(dòng)態(tài)sql的執(zhí)行原理不?
Mybatis動(dòng)態(tài)sql可以讓我們?cè)赬ml映射文件內(nèi),以標(biāo)簽的形式編寫動(dòng)態(tài)sql,完成邏輯判斷和動(dòng)態(tài)拼接sql的功能,Mybatis提供了9種動(dòng)態(tài)sql標(biāo)簽trim|where|set|foreach|if|choose|when|otherwise|bind。
其執(zhí)行原理為,使用OGNL從sql參數(shù)對(duì)象中計(jì)算表達(dá)式的值,根據(jù)表達(dá)式的值動(dòng)態(tài)拼接sql,以此來完成動(dòng)態(tài)sql的功能。
19.Mybatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對(duì)象并返回的?都有哪些映射形式?
第一種是使用標(biāo)簽,逐一定義列名和對(duì)象屬性名之間的映射關(guān)系。第二種是使用sql列的別名功能,將列別名書寫為對(duì)象屬性名,比如T_NAME AS NAME,對(duì)象屬性名一般是name,小寫,但是列名不區(qū)分大小寫,Mybatis會(huì)忽略列名大小寫,智能找到與之對(duì)應(yīng)對(duì)象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
有了列名與屬性名的映射關(guān)系后,Mybatis通過反射創(chuàng)建對(duì)象,同時(shí)使用反射給對(duì)象的屬性逐一賦值并返回,那些找不到映射關(guān)系的屬性,是無法完成賦值的。
20.Mybatis是否支持延遲加載?如果支持,它的實(shí)現(xiàn)原理是什么?
Mybatis僅支持association關(guān)聯(lián)對(duì)象和collection關(guān)聯(lián)集合對(duì)象的延遲加載,association指的就是一對(duì)一,collection指的就是一對(duì)多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,當(dāng)調(diào)用目標(biāo)方法時(shí),進(jìn)入攔截器方法,比如調(diào)用a.getB().getName(),攔截器invoke()方法發(fā)現(xiàn)a.getB()是null值,那么就會(huì)單獨(dú)發(fā)送事先保存好的查詢關(guān)聯(lián)B對(duì)象的sql,把B查詢上來,然后調(diào)用a.setB(b),于是a的對(duì)象b屬性就有值了,接著完成a.getB().getName()方法的調(diào)用。這就是延遲加載的基本原理。
當(dāng)然了,不光是Mybatis,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的。
21.MyBatis實(shí)現(xiàn)一對(duì)一有幾種方式?具體怎么操作的?
有聯(lián)合查詢和嵌套查詢,聯(lián)合查詢是幾個(gè)表聯(lián)合查詢,只查詢一次, 通過在resultMap里面配置association節(jié)點(diǎn)配置一對(duì)一的類就可以完成; 嵌套查詢是先查一個(gè)表,根據(jù)這個(gè)表里面 的結(jié)果的外鍵id,去再另外一個(gè)表里面查詢數(shù)據(jù),也是通過association配置,但另外一個(gè)表的查詢通過select屬性配置。
22.MyBatis實(shí)現(xiàn)一對(duì)多有幾種方式,怎么操作的?
有聯(lián)合查詢和嵌套查詢,聯(lián)合查詢是幾個(gè)表聯(lián)合查詢,只查詢一次,通過在resultMap里面配 置collection節(jié)點(diǎn)配置一對(duì)多的類就可以完成; 嵌套查詢是先查一個(gè)表,根據(jù)這個(gè)表里面的 結(jié)果的外鍵id,去再另外一個(gè)表里面查詢數(shù)據(jù),也是通過配置collection,但另外一個(gè)表的查詢通過select節(jié)點(diǎn)配置。
23.Mybatis比IBatis比較大的幾個(gè)改進(jìn)是什么?
(1)有接口綁定,包括注解綁定sql和xml綁定Sql ,
(2)動(dòng)態(tài)sql由原來的節(jié)點(diǎn)配置變成OGNL表達(dá)式,
(3)在一對(duì)一,一對(duì)多的時(shí)候引進(jìn)了association,在一對(duì)多的時(shí)候引入了collection 節(jié)點(diǎn),不過都是在resultMap里面配置。
24.IBatis和MyBatis在核心處理類分別叫什么?
IBatis里面的核心處理類交SqlMapClient, MyBatis里面的核心處理類叫做SqlSession
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Java框架面試題及答案",希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)