Spring 框架 4 通用 class 依赖自动装配不工作

Spring framework 4 Generic class dependency autowire is not working

In spring 4 @Autowired 不适用于 class 扩展 Region 扩展 Map

给予例外

No qualifying bean of type [com.gemstone.gemfire.pdx.PdxInstance] found for dependency [map with value type com.gemstone.gemfire.pdx.PdxInstance]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

它可能假设一个集合注入点。如何解决。即使添加 @Qualifier 也会出现同样的错误。

所以,如果我没听错(没有代码片段很难确定),我假设你有这样的东西......

class MyRegion<K, V> extends Region<K, V> {
  ...
}

然后...

@Component
class MyApplicationComponent {

  @Autowired
  private MyRegion<?, PdxInstance> region;

}

是吗?

所以,问题是,您不能使用@Autowired 将区域引用注入或自动连接到您的应用程序组件中。你必须像这样使用@Resource...

@Component
class MyApplicationComponent {

  @Resource(name = "myRegion")
  private MyRegion<?, PdxInstance> region;

}

原因是,Spring(无论版本如何),默认情况下,无论何时将 "Map" 自动装配到应用程序组件中,都会尝试创建所有已定义的 Spring beans 的映射在 Spring ApplicationContext 中。 IE。 bean ID/Name -> bean 引用。

所以,鉴于...

<bean id="beanOne" class="example.BeanTypeOne"/>

<bean id="beanTwo" class="example.BeanTypeTwo"/>

...

<bean id="beanN" class="example.BeanTypeN"/>

您最终在您的应用程序组件中获得了一个自动连接的地图...

@Autowired
Map<String, Object> beans;

beans.get("beanOne"); // is object instance of BeanTypeOne
beans.get("beanTwo"); // is object instance of BeanTypeTwo
...
beans.get("beanN"); // is object instance of BeanTypeN

因此,您的情况是,Spring 上下文中没有根据类型(GemFire 的)PdxInstance 定义的 bean。那是您(自定义)区域中的数据。因此,当它尝试分配 Spring 上下文或自动装配(自定义)区域中的所有 bean 时,Sprig 将其标识为 "Map",它无法将其他类型的 bean 分配给 PdxInstance,取 "Generic" 输入帐户。

因此,简而言之,使用@Resource 自动装配任何 GemFire 区域,自定义或其他方式。

此外,我质疑 "extend" GemFire 区域的必要性。也许最好改用包装器 ("composition")。

希望对您有所帮助。

干杯!