You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中如何优雅注入带有默认实现的接口?

问题核心原因

你给接口添加@Component的做法无效,因为Spring无法直接实例化接口,@Component注解仅对可实例化的类生效。@Primary注解的作用是在多个同类型Bean中指定优先级,当前场景下连对应类型的Bean都不存在,所以该注解自然起不到作用。

优雅的解决方案

方式一:创建空实现类并标记为Bean

编写一个继承该接口的空实现类,通过@Component让Spring扫描并创建Bean:

@Component
public class DefaultClock implements ClockInterface {
    // 无需编写额外代码,自动继承接口的默认方法
}

这种方式直观易懂,后续如果需要扩展接口功能,也能直接在实现类中修改。

方式二:通过配置类的@Bean生成实例

如果不想新增类文件,可以在配置类中用匿名内部类的方式提供Bean实例:

@Configuration
public class ClockConfig {
    @Bean
    public ClockInterface clockInterface() {
        // 匿名内部类实现接口,自动使用默认方法逻辑
        return new ClockInterface() {};
    }
}

这种方式无需新增类,适合接口默认方法足够满足需求的简单场景。

方式三:Spring 6+简化写法(可选)

若使用Spring 6及以上版本,可借助InstanceSupplier进一步简化Bean的创建:

@Configuration
public class ClockConfig {
    @Bean
    public ClockInterface clockInterface() {
        return InstanceSupplier.of(ClockInterface.class).get();
    }
}

本质和匿名内部类逻辑一致,但写法更简洁。


内容的提问来源于stack exchange,提问作者RobertC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:39:52