@Component 和 @Bean 的區別


Spring幫助我們管理Bean分為兩個部分,一個是注入Bean,一個裝配Bean。
完成這兩個動作有三種方式,一種是使用自動配置的方式、一種是使用JavaConfig的方式,一種就是使用XML配置的方式。

 

1、兩者的聯系和區別

@Component 和 @Bean 是兩種使用注解來定義bean的方式。

 

@Component(和@Service和@Repository)用於自動檢測和使用類路徑掃描自動配置bean。注釋類和bean之間存在隱式的一對一映射(即每個類一個bean)。

這種方法對需要進行邏輯處理的控制非常有限,因為它純粹是聲明性的。@Compent 作用就相當於 XML配置。

@Component
public class Student {

    private String name = "lkm";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}        

 

@Bean用於顯式聲明單個bean,而不是讓Spring像上面那樣自動執行它。它將bean的聲明與類定義分離,並允許您精確地創建和配置bean。
而@Bean則常和@Configuration注解搭配使用

@Configuration
public class WebSocketConfig {
    @Bean
    public Student student(){
        return new Student();
    }

}    


都可以使用@Autowired或者@Resource注解注入,推薦使用@Resource(小提示:為什么呢?引出另一個考點:@Autowired和@Resource的區別)

@Autowired
Student student;

@Resource
Student student;


2、為什么有了@Compent,還需要@Bean呢?
如果想將第三方的類變成組件裝配到你的應用中,你又沒有沒有源代碼,也就沒辦法使用@Component進行自動配置,這種時候使用@Bean就比較合適了。不過同樣的也可以通過xml方式來定義(如果你不嫌麻煩的話)。

另外@Bean注解的方法返回值是對象,可以在方法中為對象設置屬性。

另外大家可以了解一下Spring的Starter機制,就是通過@Bean注解來定義bean。

可以搭配@ConditionalOnMissingBean注解 @ConditionalOnMissingClass注解,如果本項目中沒有定義該類型的bean則會生效。

避免在某個項目中定義或者通過congfig注解來聲明大量重復的bean。

 

參考文章

https://blog.csdn.net/w605283073/article/details/89221522

https://stackoverflow.com/questions/10604298/spring-component-versus-bean#

https://blog.csdn.net/qq_38534144/article/details/82414201

https://blog.csdn.net/chenpengjia006/article/details/81481986


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM