2012-08-30 61 views
13

我使用基於Java的配置設置我的Spring應用程序上下文是這樣的:在配置中明確定義如何在Spring中使用@ComponentScan懶懶地加載所有bean?

@Configuration 
@Lazy 
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class}) 
public class MyAppConfig { 
    ... 
} 

豆被延遲加載的,像你期望的那樣。然而,用@Named註釋的掃描類總是急切地加載。我該如何解決這個問題?

任何幫助表示讚賞。


注意,在MyProject包中的類,我可以解決此通過@Lazy註釋它們。但另一個項目對Spring沒有依賴性,我想保留它(因此@Named而不是@Component)。


還要注意,這不會在基於XML的配置中出現問題。在那裏,在<beans>標籤接縫處設置default-lazy-init="true"做我想做的事(雖然我沒有測試過)。

+3

因此,嘗試加入少量'<豆默認延遲實例= 「true」/>'XML文件並留給Java配置。如果沒有辦法通過'@ Configuration'來做到這一點,請不要猶豫[提出問題](https://jira.springsource.org/secure/Dashboard.jspa)。 –

+0

檢查此:http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/annotation/Lazy.html – Elbek

+2

這裏有一個錯誤報告打開:https:// jira.spring.io/browse/SPR-10459 –

回答

12

從版本4.1 RC2,這個錯誤是固定的,你可以在組件掃描完成延遲加載有:

@ComponentScan(basePackages = ["..."], lazyInit = true) 

https://jira.spring.io/browse/SPR-10459

+0

太棒了。這有助於簡化我的junit配置。 – Basil

2

如前所述,沒有直接的方法來處理(在配置類中使用@Lazy)。但你可以嘗試這種方法:

我想,OtherProject是一個不使用Spring的項目,並且想象這些類沒有註釋。

那麼你應該在MYPROJECT定義看起來像這樣的配置:

@Configuration 
// Avoid use this line if classes aren't annotated @ComponentScan("com.otherProject") 
public class MyProjectConfig { 

    @Bean(name = "lazyBean") 
    @Lazy 
    public LazyBean lazyBean(){ 
     System.out.println("Loading LazyBean bean"); 
     return new LazyBean(); // Or use a static method factory, this is only an example 
    } 
} 

利用這一點,豆「lazyBean」當一些實例注入,或當你明確地調用它會被創建,但從來沒有在init時間。

請注意,你需要爲每個類定義一個你想使用的新bean,所以如果你有很多的類但是很好地減少了你的其他項目的類的可訪問性,這可能不是很好(可能不是所有的類是必要的)。

我希望這會有所幫助。

+0

實際上,其他項目的類*是*註釋的,但是使用'@ Named'。因此,我想利用'@ ComponentScan'並避免必須明確定義所有的bean。但是,謝謝你的時間,我會接受你的答案。 – rolve