面試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的更多內容!

推薦閱讀: