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