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