【问题标题】:Spring injection via javax.inject.Provider MUCH too slow通过 javax.inject.Provider 进行 Spring 注入太慢了
【发布时间】:2012-06-08 13:37:39
【问题描述】:

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

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

【问题讨论】:

  • IMO 它不应该这样做——如果服务是单例的,它应该已经被连接了。您是否处于某种调试模式,正在寻找配置更新?你在dataProvider() 做些什么吗?
  • @Dave Newton:PROVIDER 已经接线。查找发生在此提供程序的 get() 方法中。
  • 啊,我错过了Data 是会话范围的;亚历克斯是正确的——对不起。

标签: java spring spring-mvc dependency-injection


【解决方案1】:

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

问题是here

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

【讨论】:

  • 是的,这正是我在这里遇到的问题。那就等3.2发布吧。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2018-08-20
    • 2016-03-20
    相关资源
    最近更新 更多