我有一个实现以下内容的工厂对象:
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中?我知道我可以手动为每个类创建绑定,但是我正在寻找一种更简单的方法。
答案 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)));
}
}