如何集成一个工厂方法,该方法接受Class <t>并在Spring中产生T

时间:2019-05-22 05:41:52

标签: java spring spring-boot abstract-factory

我有一个实现以下内容的工厂对象:

public interface MyFactory {

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

可以这样使用:

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

它可以基于clazz产生多种实例。如果它得到工厂对象不支持的clazz,则返回null。

现在,我正在编写一个Spring应用程序(Spring Boot 2.0.1),并希望将其注入机制与factory对象一起使用。例如,我想做这样的事情:

@Controller
public class MyController {

    @Autowired
    private MyService s;
}

有没有办法像这样将MyFactory对象集成到Spring中?我知道我可以手动为每个类创建绑定,但是我正在寻找一种更简单的方法。

1 个答案:

答案 0 :(得分:0)

我添加了以下方法,该方法返回工厂对象支持的一组类:

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