Spring bean防止实例化并使用预期的实现

时间:2020-07-22 16:12:30

标签: java spring spring-boot

鉴于我有两个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。如何使用异步?

2 个答案:

答案 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)来决定要创建的项目。它并不是真正针对库的,因此您的用例并不像您想的那么简单。