我有一个工厂对象,该对象实现了以下内容:
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)));
}
}