如何在Spring中按条件提供默认bean?

2023-11-29

我想通过自定义 jar 提供默认 bean。仅当用户实现特定的abstract应该跳过默认 bean 注入。

以下设置已经可以正常工作,除了一件事:default有线类有null!我可能会缺少什么?

@Configration
public class AppConfig {
    //use the default service if the user does not provide an own implementation
    @Bean
    @Conditional(MissingServiceBean.class)
    public MyService myService() {
        return new MyService() {};
    }
}


@Component
public abstract class MyService {
    @Autowired
    private SomeOtherService other;

    //default impl of the method, that may be overridden
    public void run() {
        System.out.println(other); //null! Why?
    }
}

public class MissingServiceBean implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getBeanFactory().getBeansOfType(MyService.class).isEmpty();
    }
}

The MyServicebean 已创建并且也可以注入。但包含的类为空。

如果我删除@Conditioanl注释一切都按预期工作。


最简单的可能性是使用@Primary注解。您定义接口/抽象类并构建默认实现。到这里为止,这就是基本的弹簧自动装配。

现在您可以使用以下命令创建另一个实现@Primary并使其在应用程序上下文中可用。 Spring 现在将选择自动装配的主要实现。


Spring 4.1+ 中的另一种可能性是自动装配有序的List<Intf>并询问接口supports(...)调用以获取您输入的任何参数的当前实现supports。您给默认实现一个low priority越详细的优先级越高。像这样,您甚至可以构建更详细的默认行为。我将这种方法用于多种配置,以处理具有默认和特定实现的不同类。

一个例子是在权限评估期间,我们有一个针对基类的默认配置,另一个针对域类的更高配置,以及针对特定域实体的甚至更高的可能配置。权限评估器遍历列表并检查每个实现是否支持该类,并在这种情况下委托给实现。

我这里没有代码,但如果需要的话我可以稍后分享以使其更清楚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Spring中按条件提供默认bean? 的相关文章

随机推荐

  • 杰克逊+建造者模式?

    我希望杰克逊使用以下构造函数反序列化一个类 public Clinic String name Address address 反序列化第一个参数很容易 问题是 Address 定义为 public class Address privat
  • 如何查看linux的socket缓冲区大小

    Linux 的默认套接字缓冲区大小是多少 有什么命令可以看到吗 如果您想在终端中查看缓冲区大小 您可以查看 proc sys net ipv4 tcp rmem 供阅读 proc sys net ipv4 tcp wmem 用于写入 它们包
  • 为线程配置 log4j2

    有一个类叫做Test 它延伸自Thread 如何配置 log4j2 以便为每个测试线程创建我自己的日志文件 我正在尝试这样做 public class Test extends Thread private String name priv
  • 在 COCOS2D 中移动的触摸上绘制线条

    我正在使用 iPhone 开发一款游戏COCOS2D 其中 当用户将手指从一个点拖动到另一个点时 我需要画一条线 据我所知 我需要这样做Touches Moved method从哪里我可以获得积分 但我不知道该怎么做 有人能帮我解决这个问题
  • 如何在Xamarin中使用研究套件框架

    我正在使用 ResearchKit 制作一个健康应用程序 我想在 Xamarin 中执行此操作 因为我已经有很多可以在 Xamarin 中使用的共享代码 然而 研究套件尚未集成到 Xamarin 中 我正在考虑将框架绑定到我在 Xamari
  • 使用 EWS 托管 API 2.0 为现有约会绑定自定义扩展属性

    我想使用自定义扩展属性进行唯一的预约以放入数据库 我使用 FindAppointments 查找所有约会 var appointments service FindAppointments WellKnownFolderName Calen
  • 在 PHP 中使用正则表达式找出子域

    抱歉 如果这个挑战太小 不适合作为堆栈溢出问题 但我对正则表达式有点陌生 我的问题是 对于下面的所有示例返回字符串 token 的正则表达式是什么 token domain com token domain com token domain
  • 如何删除多页文档中的空白页?

    编辑 添加了一个答案 因为编辑太长 参见答案2 继以前关于文档合并的帖子我最终得到了一个工作脚本 感谢 Henrique 但我仍然有一个小问题 最终的 合并 文档有时包含我想删除的空白页面 取决于其他文档内容 我找不到简单的方法来做到这一点
  • 如何使用 ggrepel (或其他方式)在 ggalluvial 中对齐和标记地层

    我有一些使用生成的冲积地块ggalluvial in R 下面的代码示例产生的结果接近我想要实现的目标 例如 library ggalluvial par mar c 1 1 1 1 12 cex 0 6 xpd NA generate s
  • VBScript - 从标准输出捕获输出

    我知道这已经在另一个问题中得到了回答 但我根本不明白它是如何完成的 我试图将命令行程序 Aria2 下载器 的输出获取到 HTA 脚本中 以便可以对其进行解析 并且可以获取下载百分比 文件大小等并将其动态更新到 DIV 中 这是我已经调整并
  • Windows服务中的定时器队列

    对于 Windows 服务 我需要一个计时器来定期执行特定任务 当然 有许多选项似乎优于计时器 多线程 直接从服务的主线程调用方法 但在这种特定情况下它们都有其缺点 然而 由于显而易见的原因 如果没有 GUI 的消息队列 SetTimer
  • ReplicaSet 失败并显示无效:spec.template.metadata.labels

    为了我的学习目的 我正在尝试对replicaSet进行一些研究 我能够使用 matchLabels 成功创建副本集 为了测试 matchExpression 选择器 我首先创建了一个 pod 然后创建了一个新的副本集 以测试副本集是否能够检
  • UIWebview 缩放 PDF 和大 .图像缩放 默认 IOS

    我在用UIWebView加载具有缩放功能的 PDF 和图像 为此我检查了webView scalesPageToFit属性真实且工作正常 但我的问题是 当我加载大图像 2496 3507 时 它默认显示缩放 我不希望尺寸适合 为了克服这个问
  • 链接器命令失败,退出代码为 1;架构armv7s的未定义符号。

    这是我第一次尝试将二进制文件 iOS 应用程序的新版本 而不是全新的应用程序 上传到 iTunes 商店 当我尝试创建存档时 我收到三个Apple Mach o linker errors 在问题导航器中显示为红色 这是显示的内容 ld w
  • jQuery Masonry 与 jQuery UI Sortable 冲突

    使用 Masonry 时 jQuery UI Sortable 不起作用 知道如何避免这种冲突吗 任何帮助 将不胜感激 我想我也有类似的问题 我通过简单地调用代码中用于设置可排序元素的砌体来修复它 可能有更好的方法 我不确定 functio
  • 垂直对齐浮动 DIV

    我正在创建的网站的一部分如下 div div div div
  • asp:按钮点击事件没有被触发

    我正在 asp 表中动态添加行 在表的每一行中 我还包括一个具有 SelectProduct Click 事件的按钮 问题是 即使我注册了单击事件 该事件也没有被触发 按钮是这样添加的 btnSelect new Button btnSel
  • Delphi:如何使用 DynArraySetLength 设置 RTTI 访问的动态数组的长度?

    我想设置动态数组的长度 如建议的那样这个帖子 我有两个类 TMyClass 和相关的 TChildClass 定义为 TChildClass class private FField1 string FField2 string end T
  • 为什么通过 Homebrew 安装的 Python 不包含 Tkinter [重复]

    这个问题在这里已经有答案了 我已经通过 Homebrew 在我的 Mac 上安装了 Python brew install python 之后我检查了我的Python版本为2 7 11 然后我尝试执行 import Tkinter 我收到以
  • 如何在Spring中按条件提供默认bean?

    我想通过自定义 jar 提供默认 bean 仅当用户实现特定的abstract应该跳过默认 bean 注入 以下设置已经可以正常工作 除了一件事 default有线类有null 我可能会缺少什么 Configration public cl