如何在Spring中创建默认的可覆盖组件?

我正在尝试创建一个将自动装配的组件,除非用户创建不同的实现.

我使用以下代码尝试并隔离问题:

界面:

public interface A {...}

实施:

@Component
@ConditionalOnMissingBean(A.class)
public class AImpl implements A {...}

使用代码:

public class AUsage {
    @Autowired
    private A a;
}

在这个例子中,我没有让AImpl自动装入AUsage.
如果我在没有ConditionalOnMissingBean的另一个类中实现A,它就可以工作.

最佳答案 我尝试从互联网上复制@ConditionalOnMissingBean的现有用法,并注意到它们都引用了@Bean方法.

确实,当我将此代码添加到AUsage时:

public class AUsage {
    @Autowired
    private A a;

    @Bean
    @ConditionalOnMissingBean
    public A createA() {
        return new AImpl();
    }
}

并从AImpl中删除了注释:

public class AImpl implements A {...}

一切都按预期工作.

如果有人知道的话,我很乐意得到解释.

点赞