天天看點

@Bean 和 @Component的差別

前言  

最近研究Springboot 源碼的時候發現這兩個注解比較常出現,但是放眼看去這兩個注解好像功能都差不多,是以專門研究了一下:

注解作用

  • @Component注解表明一個類會作為元件類,并告知Spring要為這個類建立bean。
  • @Bean注解告訴Spring這個方法将會傳回一個對象,這個對象要注冊為Spring應用上下文中的bean。通常方法體中包含了最終産生bean執行個體的邏輯。

兩者對比

相同點:兩者的結果都是為spring容器注冊Bean.

不同點:@Component 通常是通過類路徑掃描來自動偵測以及自動裝配到Spring容器中。

    @Bean 注解通常是我們在标有該注解的方法中定義産生這個bean的邏輯。

了解

@Component (@Controller @Service @Respository)作用于類上,隻有在我們的SpringBoot應用程式啟用了元件掃描并且包含了被注解的類時才有效。通過元件掃描,Spring将掃描整個類路徑,并将所有@Component注釋類添加到Spring Context,這裡有的不足就是會把整個類當成bean注冊到spring 容器上,如果這個類中并不是所有方法都需要注冊為bean的話,會出現不需要的方法都注冊成為bean,這時候必須確定這些不需要的方法也能注冊為bean或者在掃描中加filter 過濾這些不需要的bean,否者spring将無法成功啟動。

@Bean相對來說就更加靈活了,它可以獨立加在方法上,按需注冊到spring容器,而且如果你要用到第三方類庫裡面某個方法的時候,你就隻能用@Bean把這個方法注冊到spring容器,因為用@Component你需要配置元件掃描到這個第三方類路徑而且還要在别人源代碼加上這個注解,很明顯是不現實的。

繼續閱讀