自动装配组件未直接引用

时间:2017-06-26 22:14:59

标签: java spring-boot dependency-injection

我有一个带有3个maven模块的spring-boot项目:producer,consumer和api。

  • Api包含一个界面。
  • 消费者依赖于api并包含main方法和@SpringBootApplication。该类也在一个包中,在其他两个jar中为所有其他类添加前缀,因此Component Scan可以找到所有内容
  • 生产者依赖于api并包含用@Service注释的api接口的实现

在Consumer中,我试图让生产者注入构造函数,但没有引用具体实现,只是接口。消费者maven模块甚至不依赖于生产者模块。这类似于在OSGi中创建应用程序的方式,其中应该从消费者隐藏具体的提供程序实现。

我的问题是生产者没有被注射。它没有被实例化,甚至没有加载它的类,因为没有人引用它。我怎样才能在春季(靴子)实现这一目标,同时保持消费者不了解混凝土生产商的强大封装要求?

当我运行应用程序时,我得到UnsatisfiedDependencyException,因为没有生成器实例化注入

这是我的代码的简化表示

package com.foo.api
public interface Doer {
}
===== different jar =====
package com.foo
@SpringBootApplication
public class Consumer {
  public static void main(String[] args) {
    SpringApplication.run(Consumer.class, args);
  }

  @Autowire
  public Consumer(Doer someDoer) {
  }
}
===== different jar ======
package com.foo.services
@Service
public class Producer implements Doer {

}

1 个答案:

答案 0 :(得分:1)

您需要将Producer模块添加为Consumer模块的依赖项,否则maven不会将其与spring boot应用程序打包 - 因此它在运行时不可用(jar丢失了)。
为了保持您定义的良好分离,请确保将依赖项的scope设置为runtime。这意味着在编译时不需要它,但maven知道它需要在运行时,因此它将依赖关系打包到应用程序。

例如,添加以下消费者的pom.xml(在设置正确的值后......):

<dependency>
  <groupId>com.foo.services</groupId>
  <artifactId>producer</artifactId>
  <version>1.2.3</version>
  <scope>runtime</scope>
</dependency>