Как интегрировать фабричный метод, который принимает класс <T>и производит T в Spring - PullRequest
0 голосов
/ 22 мая 2019

У меня есть объект фабрики, который реализует что-то вроде следующего:

public interface MyFactory {

    <T> T getInstance(Class<T> clazz);
}

Может использоваться следующим образом:

MyService s = factory.getInstance(MyService.class);

Может выдавать множество экземпляров на основе clazz. Если он получает clazz, который не поддерживается фабричным объектом, он возвращает ноль.

Сейчас я пишу приложение Spring (Spring Boot 2.0.1) и хочу использовать его механизм внедрения с фабричным объектом. Например, я хочу сделать что-то вроде этого:

@Controller
public class MyController {

    @Autowired
    private MyService s;
}

Есть ли способ интегрировать объект MyFactory в Spring, как это? Я знаю, что могу создавать привязки для каждого класса вручную, но я ищу более простой способ.

1 Ответ

0 голосов
/ 22 мая 2019

Я добавил следующий метод, который возвращает набор классов, которые поддерживает объект фабрики:

Set<Class<?>> getSupportedClasses();

Затем я поместил следующий класс в мое приложение Spring, и он, кажется, работает нормально:

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class SomeBean {

  private static final Logger log = LoggerFactory.getLogger(SomeBean.class);

  private final MyFactory factory;
  private final GenericApplicationContext context;

  @Autowired
  public SomeBean(GenericApplicationContext context, MyFactory factory) {
    this.context = context;
    this.factory = factory;
  }

  @PostConstruct
  public void init() {
    factory.getSupportedClasses().forEach(this::register);
  }

  private <T> void register(Class<T> clazz) {
    log.info("Registering {} as a bean into ApplicationContext", clazz);
    context.registerBean(clazz,
        () -> factory.getInstance(clazz),
        (beanDefinition -> beanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)));
  }
}
...