【问题标题】:Spring custom autowiringSpring 自定义自动装配
【发布时间】:2014-04-24 10:10:31
【问题描述】:

我有一个使用大量自动装配的项目,例如

@Component("componentA")
public class ComponentAImpl implements ComponentA

@Component("componentB")
public class ComponentBImpl implements ComponentB {
   @Autowired
   private ComponentA componentA;
}

但我希望客户扩展所有类,因此理想情况下,他们只需将单个 jar 添加到类路径中,应该使用扩展类而不是原始类。 如果他们可以为 bean 设置一个不同的名称,我认为会很棒,例如

@component("componentA-custom)

我只需要一些方法来自定义自动装配过程以查找最后带有“-custom”的 bean 并加载它而不是原始 bean。 有什么办法吗?

任何帮助表示赞赏。 谢谢, 马吕斯

【问题讨论】:

  • 为什么不使用@Qualifiers
  • 怎么样?我不想修改我的代码或任何参考。我只希望@Autowire 注释先查找任何自定义实现,然后在未找到自定义实现时使用原始实现。

标签: java spring dependency-injection autowired


【解决方案1】:

我找到了解决办法,有

@Primary

可用于指定应加载添加的自定义代码而不是原始代码的注释。

【讨论】:

    【解决方案2】:

    您要查找的内容类似于 this
    这应该可以帮助您解决问题。 如果您需要获取 bean 名称,您可以注入 applicationContext 的一个实例,该实例将为您获取正确的 bean 名称(通过反向查找)。或强制所有 bean(ComponentA 和 CustomImplementation)实现BeanNameAware

    【讨论】:

      【解决方案3】:

      您所问的可以通过@Qualifier 注解完成,但它不能动态生成bean 名称。

      要允许外部bean,您需要为此创建XML 配置,因为它会覆盖基于注释的配置。您的客户必须提供:

      1. 新豆
      2. 使用新 bean 的应用程序的 XML 配置。

      【讨论】:

      • 我的班级用@Component("componentA") 注释,我想让客户创建一个用@Component("componentA-custom") 注释的自定义实现,应该在自动装配过程中使用。因此,基本上我需要自定义按名称查找类的方式,以便首先按不同的名称查找,如果没有找到 - 使用默认机制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2016-04-15
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多