【问题标题】:How to integrate a factory method which accepts Class<T> and produces T into Spring如何将接受 Class<T> 并产生 T 的工厂方法集成到 Spring 中
【发布时间】:2019-05-22 05:41:51
【问题描述】:

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

public interface MyFactory {

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

可以这样使用:

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

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

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

@Controller
public class MyController {

    @Autowired
    private MyService s;
}

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

【问题讨论】:

  • 既然你有工厂,为什么不从工厂本身获取实例呢?如果你想使用依赖注入,你可以通过编程方式将 bean 注册到 spring 的应用程序上下文中。
  • 因为它将是样板文件。如果我能像问题中那样写会更干净
  • 实例是如何创建的?如果实例不是 bean,则依赖注入将不起作用。如果你想要更精细的控制,你可以使用@Qualifier@Autowired 来注入一个基于名称而不是类型的特定bean
  • 它们不是 bean,它们与 Spring 无关,这就是为什么我要问如何。顺便说一句,根据您所说的,我正在考虑将方法 Set&lt;Class&lt;?&gt;&gt; getSupportedClasses() 添加到 MyFactory 并执行以下操作: baeldung.com/spring-5-functional-beans 。谢谢

标签: java spring spring-boot abstract-factory


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2012-05-27
    • 2017-12-04
    相关资源
    最近更新 更多