Как предоставить Spring @Bean модулю Java 9 (предоставляет … с помощью …)

#java #spring #java-9 #java-module

#java #spring #java-9 #java-module

Вопрос:

Существует ли (чистый) способ предоставить инициализированный Spring Bean в качестве сервисной реализации в модуле Java 9?

Лучшее решение, о котором я думаю прямо сейчас, это :

module-info.java

 module my.module {
   provides Service with ServiceWrapper;
}
  

Service.java

 public interface Service {
    void doSomething();
}
  

ServiceImpl.java

 @Component
public class ServiceImpl implements Service, InitializingBean {

    @Autowired SomeDependency dep;

    public void doSomething() {
        ...
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        ServiceWrapper.INSTANCE.set(() -> this);
    }

}
  

ServiceWrapper.java

 public class ServiceWrapper implements Service {

    static final ServiceWrapper INSTANCE = new ServiceWrapper();

    private Supplier<Service> supplier;

    void set(Supplier<Service> supplier) {
        this.supplier = supplier;
    }

    public void doSomething() {
        this.supplier.get().doSomething();
    }

    public static Service provider() {
        return ServiceWrapper.INSTANCE;
    }
}