我們在大型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()
方法被調用?
國際海事組織它不應該這樣做 - 如果服務是單身,它應該已經連線。你是否在某種調試模式下尋找配置更新?你在'dataProvider()'中做了什麼嗎? –
@Dave Newton:PROVIDER已連線。查找發生在這個提供者的get()方法中。 – kayahr
啊,我錯過了'Data'是會話範圍的;亞歷克斯是正確的 - 抱歉。 –