面試JAVA時,問到spring該怎么回答
Spring面試十連問
1、談?wù)剬OC的理解?
IOC,就是我們經(jīng)常所說的控制反轉(zhuǎn),DI,就是依賴注入,這兩個是對同一個事物從不同角度的解釋。沒有使用spring框架的時候,我們需要使用一個對象,經(jīng)常需要自己去手動new,需要自己取管理對象。使用spring的IOC容器之后,對象交給spring的IOC容器管理,bean的創(chuàng)建,初始化,結(jié)束,依賴注入等一系列,全部由IOC容器幫我們完成,我們在需要使用的時候,直接調(diào)用就行了。
2、多個AOP的順序怎么定義
通過 Ordered 和 PriorityOrdered 接口進(jìn)行排序。PriorityOrdered 接口的優(yōu)先級比 Ordered 更高,如果同時實(shí)現(xiàn) PriorityOrdered 或 Ordered 接口,則再按 order 值排序,值越小的優(yōu)先級越高。
3、springBean是線程安全的嗎?
結(jié)論: Bean是線程不安全的
Spring容器中的Bean是否線程安全,容器本身并沒有提供對Bean的線程安全策略,因此可以說Spring的Bean本身不具備線程安全的特性。
如果Bean是無狀態(tài)的,那么Bean則是線程安全的
如果Bean是有狀態(tài)的,那么Bean就不是線程安全的
另外,Bean是不是線程安全,跟Bean的作用域沒有關(guān)系,Bean的作用域只是表示Bean的生命周期范圍,對于任何生命周期Bean都是一個對象,這個對象是不是線程安全的,還是得看Bean里的這個對象本身
4、Spring中的bean生命周期?
1.Bean容器找到配置文件中Spring Bean的定義。
2.Bean容器利用Java Reflection API創(chuàng)建一個Bean的實(shí)例。
3.如果涉及到一些屬性值,利用set()方法設(shè)置一些屬性值。
4.如果Bean實(shí)現(xiàn)了BeanNameAware接口,調(diào)用setBeanName()方法,傳入Bean的名字。
5.如果Bean實(shí)現(xiàn)了BeanClassLoaderAware接口,調(diào)用setBeanClassLoader()方法,傳入ClassLoader對象的實(shí)例。
6.如果Bean實(shí)現(xiàn)了BeanFactoryAware接口,調(diào)用setBeanClassFacotory()方法,傳入ClassLoader對象的實(shí)例。
7.與上面的類似,如果實(shí)現(xiàn)了其他*Aware接口,就調(diào)用相應(yīng)的方法。
8.如果有和加載這個Bean的Spring容器相關(guān)的BeanPostProcessor對象,執(zhí)行postProcessBeforeInitialization()方法。
9.如果Bean實(shí)現(xiàn)了InitializingBean接口,執(zhí)行afeterPropertiesSet()方法。
10.如果Bean在配置文件中的定義包含init-method屬性,執(zhí)行指定的方法。
11.如果有和加載這個Bean的Spring容器相關(guān)的BeanPostProcess對象,執(zhí)行postProcessAfterInitialization()方法。
12.當(dāng)要銷毀Bean的時候,如果Bean實(shí)現(xiàn)了DisposableBean接口,執(zhí)行destroy()方法。
13.當(dāng)要銷毀Bean的時候,如果Bean在配置文件中的定義包含destroy-method屬性,執(zhí)行指定的方法。
5、Spring 框架中都用到了哪些設(shè)計模式?
1.工廠模式:BeanFactory就是簡單工廠模式的體現(xiàn),用來創(chuàng)建對象的實(shí)例;
2.單例模式:Bean默認(rèn)為單例模式。
3.代理模式:Spring的AOP功能用到了JDK的動態(tài)代理和CGLIB字節(jié)碼生成技術(shù);
4.模板方法:用來解決代碼重復(fù)的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。觀
5.察者模式:定義對象鍵一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都會得到通知被制動更新,如Spring中l(wèi)istener的實(shí)現(xiàn)–ApplicationListener。
6、@Autowired和@Resource之間的區(qū)別
@Autowired可用于:構(gòu)造函數(shù)、成員變量、Setter方法
@Autowired和@Resource之間的區(qū)別
- @Autowired默認(rèn)是按照類型裝配注入的,默認(rèn)情況下它要求依賴對象必須存在(可以設(shè)置它required屬性為false)。
- @Resource默認(rèn)是按照名稱來裝配注入的,只有當(dāng)找不到與名稱匹配的bean才會按照類型來裝配注入。
7、Spring支持的事務(wù)管理類型?
Spring支持兩種類型的事務(wù)管理:
編程式事務(wù)管理:這意味你通過編程的方式管理事務(wù),給你帶來極大的靈活性,但是難維護(hù)。
聲明式事務(wù)管理:這意味著你可以將業(yè)務(wù)代碼和事務(wù)管理分離,你只需用注解和XML配置來管理事務(wù)。
8、你更傾向用那種事務(wù)管理類型?
大多數(shù)Spring框架的用戶選擇聲明式事務(wù)管理,因為它對應(yīng)用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想。聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,雖然比編程式事務(wù)管理(這種方式允許你通過代碼控制事務(wù))少了一點(diǎn)靈活性。唯一不足地方是,最細(xì)粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。
9、Spring事務(wù)中有哪幾種事務(wù)傳播行為?
在TransactionDefinition接口中定義了八個表示事務(wù)傳播行為的常量。
支持當(dāng)前事務(wù)的情況:
PROPAGATION_REQUIRED
:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。
PROPAGATION_SUPPORTS
: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
PROPAGATION_MANDATORY
: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。(mandatory:強(qiáng)制性)。
不支持當(dāng)前事務(wù)的情況:
PROPAGATION_REQUIRES_NEW
: 創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED
: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER
: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
其他情況:
PROPAGATION_NESTED
: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;如果當(dāng)前沒有事務(wù),則該取值等價于PROPAGATION_REQUIRED。
10、Spring通知有哪些類型?
在AOP術(shù)語中,切面的工作被稱為通知,實(shí)際上是程序執(zhí)行時要通過SpringAOP框架觸發(fā)的代碼段。
Spring切面可以應(yīng)用5種類型的通知:
1.前置通知(Before):在目標(biāo)方法被調(diào)用之前調(diào)用通知功能;
2.后置通知(After):在目標(biāo)方法完成之后調(diào)用通知,此時不會關(guān)心方法的輸出是什么;
3.返回通知(After-returning ):在目標(biāo)方法成功執(zhí)行之后調(diào)用通知;
4.異常通知(After-throwing):在目標(biāo)方法拋出異常后調(diào)用通知;
5.環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為。
總結(jié)
本片文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JAVA實(shí)現(xiàn)微信APPV3支付保姆級教程
微信實(shí)現(xiàn)支付功能與支付寶實(shí)現(xiàn)支付功能是相似的,這篇文章主要介紹了JAVA實(shí)現(xiàn)微信APPV3支付的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01SpringBoot自定義全局異常處理器的問題總結(jié)
Springboot框架提供兩個注解幫助我們十分方便實(shí)現(xiàn)全局異常處理器以及自定義異常,處理器會優(yōu)先處理更具體的異常類型,如果沒有找到匹配的處理器,那么它會尋找處理更一般異常類型的處理器,本文介紹SpringBoot自定義全局異常處理器的問題,一起看看吧2024-01-01Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法
這篇文章給大家介紹了spring-boot中如何定義過濾器、監(jiān)聽器和攔截器,對Spring Boot 編寫Servlet、Filter、Listener、Interceptor的相關(guān)知識感興趣的朋友一起看看吧2017-07-07java 設(shè)計模式之State(狀態(tài)模式)
這篇文章主要介紹了java 設(shè)計模式之State(狀態(tài)模式)的相關(guān)資料,一個類的行為基于它的狀態(tài)的改變而改變。狀態(tài)模式歸屬于行為型模式,需要的朋友可以參考下2017-08-08簡單了解Java刪除字符replaceFirst原理及實(shí)例
這篇文章主要介紹了簡單了解Java刪除字符replaceFirst原理及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05詳解Java編譯優(yōu)化之循環(huán)展開和粗化鎖
之前在講JIT的時候,有提到在編譯過程中的兩種優(yōu)化循環(huán)展開和粗化鎖,今天從Assembly的角度來驗證一下這兩種編譯優(yōu)化方法,快來看看吧。2021-06-06