如何在Spring Boot中通过post调用注入依赖项?

时间:2018-10-28 05:49:33

标签: java spring-boot

我有一个帖子映射,它将映射到一个配置文件。配置文件包含一些我想注入依赖关系的参数。 对于每个配置文件,我都可以注入完全不同的一组实现。 使用guice,我可以通过在我的配置文件中添加模块属性并在接收配置文件时创建该guice模块来做到这一点,并且其他依赖项注入由guice负责。

public class GuiceModule extends AbstractModule {
public GuiceModule(Profile profile) {
                    super(profile);
                  }
                @Override
                protected void configureModule() { 
                  bind(Bean1.class).toProvider(Bean1Impl.class);
                  bind(Bean2.class).to(Bean2Impl.class);
                  bind(Bean3.class).to(Bean3Impl.class);
                  bind(Bean4.class).to(Bean4Impl.class);
                  bind(Bean5.class).to(Bean5Imple.class);
                  bind(ParentBean.class).to(ParentBeanImpl.class);
              }

              @Override
              public void configure() {
                this.configureModule();
              }   
    }

在我的控制器中

@PostMapping(path = "/profiles/add" , consumes = "application/json")
    void addProfile(@RequestBody Profile profile)
        {
            //with guice 
            Injector injector = Guice.getInjector(Class.forName(profile.getModule));
            injector.getInstance(ParentBean.class).execute();
        }

但是使用spring-boot无法找到实现该目标的方法。
更新,我每次在帖子中收到新的个人资料时都可以创建一个新的AnnotationConfigApplicationContext。代码如下所示。

@PostMapping(path = "/profiles/add" , consumes = "application/json")
void addProfile(@RequestBody Profile profile)
{
    String clazz = profile.getConfigurationClass();
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Class.forName(clazz)); //This will create a new IoC container with its own beans.
    ParentBean bean = context.getBean(ParentBean.class)
    bean.execute()
}

这可以工作,但是我不确定这是否是一个好习惯。

1 个答案:

答案 0 :(得分:1)

在问题中,尚不清楚哪个参数决定了服务调用。假设它是一个枚举,则可以保留一个以枚举为键的映射,并自动将服务自动绑定为一个值。现在,基于该参数,您可以调用其他实现。

@PostMapping(path = "/profiles/add" , consumes = "application/json")
void addProfile(@RequestBody Profile profile)
{
 Object service =  this.map.get("your_field");
 service.yourMethod(profile);
}