springbean阻止实例化并使用预期的实现



假设我有两个处理器接口的实现:

一个同步:

@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;
      }
    }

最新更新