提问者:小点点

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


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

@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。

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


共2个答案

匿名用户

DefaultListableBeanFactory. getBeanNamesForType的性能作为一个问题提出,并已在Spring 3.2中修复。

问题就在这里

你可以试试3.2 M1,看看它是否能改善这种情况。

匿名用户

7年后,提供者