我们在大型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()
方法被调用?
国际海事组织它不应该这样做 - 如果服务是单身,它应该已经连线。你是否在某种调试模式下寻找配置更新?你在'dataProvider()'中做了什么吗? –
@Dave Newton:PROVIDER已连线。查找发生在这个提供者的get()方法中。 – kayahr
啊,我错过了'Data'是会话范围的;亚历克斯是正确的 - 抱歉。 –