我有一个带有3个maven模块的spring-boot项目:producer,consumer和api。
main
方法和@SpringBootApplication
。该类也在一个包中,在其他两个jar中为所有其他类添加前缀,因此Component Scan可以找到所有内容@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 {
}
答案 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>