2012-06-08 112 views
1

我们在大型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()方法被调用?

+0

国际海事组织它不应该这样做 - 如果服务是单身,它应该已经连线。你是否在某种调试模式下寻找配置更新?你在'dataProvider()'中做了什么吗? –

+0

@Dave Newton:PROVIDER已连线。查找发生在这个提供者的get()方法中。 – kayahr

+0

啊,我错过了'Data'是会话范围的;亚历克斯是正确的 - 抱歉。 –

回答

2

DefaultListableBeanFactory.getBeanNamesForType性能有人提出这样一个问题,并已被固定在春季3.2。

的问题是here

你可以试试3.2 M1,看它是否提高的情况。

+0

是的,这正是我在这里遇到的问题。必须等到3.2版发布。 – kayahr