鉴于我有两个Processor接口实现:
一个同步:
@Service("Synchronous")
@Primary
public class SyncProcessor implements Processor { ... }
其他异步:
@Service("Asynchronous")
public class AsynchronousProcessor implements Processor { ... }
使用这些服务的类:
public class TestController{
private final Processor processor;
public TestController(final Processorprocessor) {
this.processo r= processor;
}
}
这些服务和控制器类位于公共库框架maven项目(例如项目A)中,它们作为依赖项注入到其他项目(例如项目B和C)中。
我希望项目B和C在默认情况下使用SyncProcessor,因为它用@Primary进行了注释。
但是,异步服务也被实例化了,我想防止这种情况。
仅当在项目B和C中执行以下操作时,才应实例化它:
@Bean("customAsync")
public Processor processor(MyRepo repo,
JobRunner jobRunner) {
return new AsynchronousProcessor (repo, jobRunner);
}
我当前遇到的问题是AsyncProcessor实例被多次创建。如何防止这种情况发生?
我遇到的另一个问题是,即使在项目B中创建Bean时,也会调用同步Bean。如何使用异步?
答案 0 :(得分:0)
@Primary
处理器 @RestController
public class TestController{
private final Processor processor;
public TestController(final Processorprocessor) {
this.processor = processor;
}
}
@Primary
以外的处理器,则必须指定它 @RestController
public class TestController{
@Autowired
@Qualifier("customAsync")
private final Processor processor;
public TestController(final Processorprocessor) {
this.processor = processor;
}
}
答案 1 :(得分:0)
您可以使用@Profile
,以便在启动时决定使用哪种处理器。
@Component
@Profile("sync")
public class SyncProcessor implements Processor {...}
@Component
@Profile("async")
public class SyncProcessor implements Processor {...}
这样,您的项目可以通过相应地设置spring.profiles.active
属性(sync或async)来决定要创建的项目。它并不是真正针对库的,因此您的用例并不像您想的那么简单。