2012-06-08 166 views
1

我們在大型Web應用程序中使用Spring依賴注入。有必須與請求或會話數據的工作服務,我們與javax.inject.Provider接口這樣實現了它(我們使用構造器注入,但在這個例子中我注入提供商直接進入場這樣的例子更短):通過javax.inject.Provider進行Spring注入太慢了太多了

@Service 
public class SomeService() 
{ 
    @Autowired 
    public Provider<Data> dataProvider; 

    public void doSomething() 
    { 
     Data data = this.dataProvider().get() 

     ...Do something with the request... 
    } 
} 

在這個例子中Data是一些會話範圍的數據。該服務本身是一個單身人士。

現在的問題是,dataProvider.get()調用是方式太慢。它需要幾秒鐘才能完成。我調試了電話,發現時間在方法DefaultListableBeanFactory.getBeanNamesForType的某處被燒燬。在這個方法中,獲取所有bean定義名稱的列表(其中包含超過1000個名稱(我們有很多控制器,DAO和服務...),並重複查找要注入的bean。沒用,如果是那麼慢,我很震驚,我們有這麼多的春豆,但沒有一種方法來提高javax.inject.provider東西的查找速度或解決這種注入的一個不同的方式嗎?也許有一些的方式來定義我們自己的供應商實現其春季可以注入,因此不會搜索匹配豆每次的Provider.get()方法被調用?

+0

國際海事組織它不應該這樣做 - 如果服務是單身,它應該已經連線。你是否在某種調試模式下尋找配置更新?你在'dataProvider()'中做了什麼嗎? –

+0

@Dave Newton:PROVIDER已連線。查找發生在這個提供者的get()方法中。 – kayahr

+0

啊,我錯過了'Data'是會話範圍的;亞歷克斯是正確的 - 抱歉。 –

回答

2

DefaultListableBeanFactory.getBeanNamesForType性能有人提出這樣一個問題,並已被固定在春季3.2。

的問題是here

你可以試試3.2 M1,看它是否提高的情況。

+0

是的,這正是我在這裏遇到的問題。必須等到3.2版發佈。 – kayahr