如何将接受类并产生T的工厂方法集成到<T>Spring中



我有一个工厂对象,该对象实现了以下内容:

public interface MyFactory {
    <T> T getInstance(Class<T> clazz);
}

可以这样使用:

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

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

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

@Controller
public class MyController {
    @Autowired
    private MyService s;
}

有什么方法可以将myfactory对象集成到这样的弹簧中?我知道我可以手动为每个班级创建绑定,但我正在寻找一种更简单的方法。

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

Set<Class<?>> getSupportedClasses();

然后,我将以下课程放入我的春季应用程序中,似乎工作正常:

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

最新更新