1、兩者的聯系和區別
@Component 和 @Bean 是兩種使用注解來定義bean的方式。
@Component(和@Service和@Repository)用於自動檢測和使用類路徑掃描自動配置bean。注釋類和bean之間存在隱式的一對一映射(即每個類一個bean)。
這種方法對需要進行邏輯處理的控制非常有限,因為它純粹是聲明性的。
@Bean用於顯式聲明單個bean,而不是讓Spring像上面那樣自動執行它。它將bean的聲明與類定義分離,並允許您精確地創建和配置bean。
@Component public class Student { private String name = "lkm"; public String getName() { return name; } public void setName(String name) { this.name = name; } }
而@Bean則常和@Configuration注解搭配使用
@Configuration public class WebSocketConfig { @Bean public Student student(){ return new Student(); } }
都可以使用@Autowired或者@Resource注解注入。
2、為什么有了@Compent,還需要@Bean呢?
如果想將第三方的類變成組件,你又沒有沒有源代碼,也就沒辦法使用@Component進行自動配置,這種時候使用@Bean就比較合適了。不過同樣的也可以通過xml方式來定義。
另外@Bean注解的方法返回值是對象,可以在方法中為對象設置屬性。
另外大家可以了解一下Spring的Starter機制,就是通過@Bean注解來定義bean。
可以搭配@ConditionalOnMissingBean注解 @ConditionalOnMissingClass注解,如果本項目中沒有定義該類型的bean則會生效。
避免在某個項目中定義或者通過congfig注解來聲明大量重復的bean。