繁体   English   中英

我可以覆盖使用类路径扫描定义的Spring bean定义吗?

[英]Can I override a spring bean definition defined using classpath scan?

我有一个应用程序,它具有非常简单的插件体系结构,可以通过使用Spring类路径扫描来注册其他行为(通过将plugin.jar放在类路径上来“安装”插件)。

这非常适合注册其他bean,也非常适合注册如下的钩子:

// core.jar:
@Component
class CoreClass {
  public void addListener(Listener listener) { /* ... */ }
}

// plugin.jar
@Component
class Plugin {
  public Plugin(CoreClass coreClass) {
    coreClass.addListener(new PluginListener());
  }
}

但是有时替换整个bean更合适。 可能看起来像这样:

// core.jar:
@Component("someBean")
class CoreClass implements CoreInterface {
  @Override
  public void doStuff();
}

// plugin.jar
@Component("someBean")
@Order(HIGHEST_PRECEDENCE)
class Plugin implements CoreInterface {
  @Override
  public void doStuff();
}

在这种情况下,我希望在启动过程中通过类路径扫描同时发现PluginCoreClass ,但随后应该忽略CoreClass ,因为bean someBean具有另一个具有更高优先级的定义。

我知道我可以使用XML( <import resource="classpath*:plugin-spring.xml" /> )来完成此操作,因为XML允许覆盖定义。 但这也可以使用注释吗?

编辑:请注意,有时我会注入基于名称的相同类型(具有不同属性)的多个bean实例。 因此,我实际上需要使用特定名称覆盖bean。

可能使用的解决方案:

@主

指示当多个候选者有资格自动装配单值依赖项时,应优先考虑Bean。 如果候选对象中仅存在一个“主” bean,它将是自动装配的值。

该注释在语义上等效于Spring XML中元素的主要属性。

可以用于直接或间接用@Component注释的任何类,或用@Bean注释的方法。

// core.jar:
@Component
class CoreClass implements CoreInterface {
  @Override
  public void doStuff();
}

// plugin.jar
@Component
@Primary
class Plugin implements CoreInterface {
  @Override
  public void doStuff();
}

http://memorynotfound.com/handling-multiple-autowire-candidates-with-spring-primary/

或者您可以使用:

@Configuration  
@ImportResource( { "classpath*:core-spring.xml", "classpath*:plugin-spring.xml" } )  
public class ConfigClass { } 

我怀疑注解的问题不清楚要覆盖哪个顺序,如果您在注解中定义了相同的名称,则最终将出现ConflictingBeanDefinitionException弹簧,将不允许您使用相同名称的@Component@Bean 在xml中,您可以管理覆盖顺序,因此可以在xml上进行覆盖。 在注释中,您不能这样做。

任何给定的Spring上下文对于任何给定的id或name只能有一个bean 对于XML id属性,这是通过模式验证来强制执行的。 对于name属性,这是由Spring的逻辑强制执行的。

但是,如果上下文是从两个不同的XML描述符文件构造的,并且两个文件都使用了ID,则一个将“覆盖”另一个。 确切的行为取决于上下文加载文件时文件的顺序。

因此,尽管有可能,但不建议这样做。 它容易出错且易碎,如果更改一个ID而不更改另一个ID,您将无法从Spring获得帮助。

但是,如果上下文是从两个不同的XML描述符文件构造的,并且两个文件都使用了ID,则一个将“覆盖”另一个。 确切的行为取决于上下文加载文件时文件的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM