假设我有两个处理器接口的实现:
一个同步:
@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。如何使用async?
您可以使用@Profile
,这样您就可以在启动时决定使用什么处理器。
@Component
@Profile("sync")
public class SyncProcessor implements Processor {...}
@Component
@Profile("async")
public class SyncProcessor implements Processor {...}
通过这种方式,您的项目可以通过相应地设置spring.profiles.active
属性(sync或async(来决定将创建哪个。它并不是真正针对库的,所以您的用例并不像您想要的那么简单,。
- 默认情况下,以下将注入您的
@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;
}
}