未从另一个模块找到 Bean

Com*_*ple 1 java spring maven spring-boot

我正在为一个问题而苦苦挣扎,但我不知道如何解决它。

这是我使用 Maven 的项目的结构:

我的项目:

  • moduleA <-- 依赖于 moduleB 和 moduleC
  • moduleB <-- 没有依赖项
  • moduleC <-- 依赖于 moduleB

我在moduleB中写了两个接口,其中一个在moduleB中实现,另一个在moduleC中实现。

问候语界面:

public interface Greeting {
    WelcomeMessage greet();
}
Run Code Online (Sandbox Code Playgroud)

它的实现写在 moduleB 上:

@Component
public class HelloWorld implements Greeting {

    private final Messages messages;

    public HelloWorld(Messages messages) {
        this.messages = messages;
    }

    @Override
    public WelcomeMessage greet() {
        return messages.getWelcomeMessage();
    }
}
Run Code Online (Sandbox Code Playgroud)

消息接口:

public interface Messages {
    WelcomeMessage getWelcomeMessage();
}
Run Code Online (Sandbox Code Playgroud)

它的实现写在 moduleC 上:

@Component
public class MessagesImpl implements Messages {

    private final Mapper mapper;
    private final MessageRepository messageRepository;

    public MessagesImpl(Mapper mapper, MessageRepository messageRepository) {
        this.mapper = mapper;
        this.messageRepository = messageRepository;
    }

    @Override
    public WelcomeMessage getWelcomeMessage() {
        // do something with repository and mapper
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 Spring 似乎没有使用 moduleC 中的 Messages 实现,当我启动应用程序时会显示此错误:

**required a bean of type 'fr.mypackage.core.spi.Messages' that could not be found**
Run Code Online (Sandbox Code Playgroud)

而且 IntelliJ 一直告诉我 MessagesImpl 从未被使用过。

Nya*_*ope 6

这是我为我的图书馆所做的事情:

  • 每个库在顶级包级别都有一个配置类@ComponentScan
  • 如果需要的话它可以是空的或者有额外的bean
  • 然后,要么使用 src/main/resouces 中的 META-INF/spring.factories 文件对库进行自动配置,其内容为:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.my.library.MyLibraryConfiguration
Run Code Online (Sandbox Code Playgroud)
  • 或者我在主应用程序配置类中手动导入配置类@Import(com.example.my.library.MyLibraryConfiguration)

对于模块,我推荐自动配置方法。您可以@ComponentScan从主应用程序中获取库的包,但我不建议这样做,它会给您带来较少的控制并且可能会很混乱。