通过javax.inject.Provider进行Spring注入太慢了

时间:2012-06-08 13:37:40

标签: java spring spring-mvc dependency-injection

我们在大型Web应用程序中使用Spring依赖注入。有些服务必须使用请求或会话数据,我们使用javax.inject.Provider接口实现它(我们使用构造函数注入,但在此示例中,我将提供程序直接注入字段,因此示例更短):< / p>

@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()来电 WAY 太慢了。它需要几秒钟才能完成。我调试了调用,发现时间在方法DefaultListableBeanFactory.getBeanNamesForType中的某处被烧毁了。在此方法中,将获取所有bean定义名称的列表(其中包含超过1000个名称(我们有许多控制器,DAO和服务......)并迭代以查找要注入的bean。

如果这很慢,这几乎没用。我很震惊,我们已经拥有了这么多的Spring bean,但是没有办法提高javax.inject.provider内容的查找速度或者解决这种注入的不同方法吗?也许有一些方法来定义我们自己的提供程序实现,Spring可以注入,所以每次调用Provider.get()方法时都不会搜索匹配的bean?

2 个答案:

答案 0 :(得分:2)

DefaultListableBeanFactory.getBeanNamesForType的性能已成为一个问题,并已在Spring 3.2中得到修复。

问题是here

您可以尝试使用3.2 M1来查看它是否能改善这种情况。

答案 1 :(得分:0)

7年后,Provider <>注入仍然很慢。有关可能的解决方法,请参见Spring injection of Provider<String> is slow