Java 每个请求加载不同的无状态Springbean

Java 每个请求加载不同的无状态Springbean,java,spring,dependency-injection,inversion-of-control,Java,Spring,Dependency Injection,Inversion Of Control,我试图找出使用Spring(或不使用Spring)按需加载bean的最佳方法。这里有一个例子。假设有两种类型的机械豆 @Bean("japanese-mechanic") public Mechanic japaneseMechanic(){ return new JapaneseMechanicImpl } @Bean("german-mechanic") public Mechanic germanMechanic(){ return new GermanMechanicImpl

我试图找出使用Spring(或不使用Spring)按需加载bean的最佳方法。这里有一个例子。假设有两种类型的机械豆

@Bean("japanese-mechanic")
public Mechanic japaneseMechanic(){
  return new JapaneseMechanicImpl
}

@Bean("german-mechanic")
public Mechanic germanMechanic(){
  return new GermanMechanicImpl
}
我的问题是如何为每个请求加载正确的bean。目前,我们这样做的方式是使用“Context.getBean”,所以它看起来像

String beanName = request.getParameter("typeOfCar") + "-mechanic";
Mechanic mechanic = Context.getBean(beanName,Mechanic.class);

我知道这样调用“Context.getBean”违反了IOC,所以寻找更好的方法来实现这一点,如果可行的话。有人能提出一些替代方案吗?谢谢

通过将所有机制连接到您自己的地图,您可以避免直接访问上下文,如下所示:

@Autowired
Map<String, Mechanic> mechanics;

Mechanic mechanic = mechanics.get(beanName);
@Autowired
地图力学;
机修工=机修工.get(beanName);

因此,您不必从上下文映射获取bean,而是将它们自动连接到您自己的映射并从那里获取它们。可以认为是更好的样式,或者如果您有无法直接访问上下文的要求。

我对使用没有任何此类限制Context@Seagull你说过你不想使用Context.getBean()。这是另一种选择,尽管它在技术上基本上是等效的。但这并不是完全等效的,因为你仍然让Spring处理自动布线,所以你可以模拟地图(当然你也可以模拟上下文)。是的,我理解你在那里做什么,只是不完全相信这是否是实现这一点的唯一方法。AFAIK没有办法直接在Spring中基于请求参数自动连接bean。如果你想把2行代码压缩成200行,你可以自己编写一个处理程序。哈哈,不太可能