前言
最近研究Springboot 源碼的時候發現這兩個注解比較常出現,但是放眼看去這兩個注解好像功能都差不多,所以專門研究了一下:
注解作用
- @Component注解表明一個類會作為組件類,並告知Spring要為這個類創建bean。
- @Bean注解告訴Spring這個方法將會返回一個對象,這個對象要注冊為Spring應用上下文中的bean。通常方法體中包含了最終產生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你需要配置組件掃描到這個第三方類路徑而且還要在別人源代碼加上這個注解,很明顯是不現實的。