1

我们在大型 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?

4

2 回答 2

2

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

问题在这里

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

于 2012-06-08T13:44:22.670 回答
0

7 年后,Provider<> 注入仍然很慢。有关可能的解决方法,请参阅Provider<String> 的 Spring 注入速度很慢

于 2019-09-12T23:27:28.347 回答