2014-10-07 43 views
1

Guice沒有類似的概念。例如,Guice可以使用默認構造函數自動注入任何類,而不需要任何特殊的類註解。爲什麼spring在啓動時必須瞭解每個bean? 爲了自動裝配的目的,不能彈簧只從類路徑中查找類?我能想到的一個原因是AOP。但是如果你不使用AOP,整個bean定義計算會增加大量的啓動時間,這是完全不必要的。春天@Component有什麼用?

編輯:

明確,我想春天從classpath查找點播類

@Component 
class Bar { 

} 

@Component 
class Foo { 
    @Autowired Bar bar; 
    public void doSomething() {} 
} 

所以當我用getBean()春天創建bean Foo可以看到,它需要一個Bar所以它可以簡單地在類路徑中查找Bar。這是Guice所做的,它避免了在開發過程中非常緩慢的不必要的組件掃描。

回答

1

@Component,@Repository,@Controller,@Service註釋定義了可以被Spring IoC容器「組件掃描」的各種bean。您可以指定定義Spring上下文時掃描哪個軟件包。

您可以顯式使用類來創建註冊Spring bean。在這種情況下,您不需要使用註釋。

AFAIK沒有使用註釋自動掃描bean。我個人喜歡這樣一個事實,即通過查看IoC容器驅動的類(當您使用組件掃描時)很明顯。希望這種沒有註釋的掃描想法永遠不會滲透到Spring中。

編輯

是的,可以,但你需要註冊這個類作爲一個bean。使用Java配置的示例:

@Configuration 
public class SpringConfig{ 

    @Bean 
    public Bar createBarBean(){ 
     new Bar(); 
    } 
} 

但我相信這對您並不方便,因爲您不想明確註冊每個bean。這將是矯枉過正。

這裏有春的文檔的一些相關部分:

我不知道任何其他bean的查找機制。

+0

謝謝,這回答我的問題,但我想要更多的東西:當需要一個類自動裝入另一個類時,Spring可以根據需要簡單地在classpath上查找類?這將消除組件掃描。我編輯我的問題是更具體。 – sha 2014-10-08 03:46:49