使用运行时定义的配置实例化按需Bean

时间:2020-01-19 14:25:50

标签: java spring spring-context

在我的应用程序中,我想按需实例化一个类,并将一些运行时参数传递给,并使Spring自动满足任何@Autowired依赖项。例如,我想按需实例化的类:

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class FileProcess implements Runnable
{
    @Autowired
    private MyDAO myDAO;

    private String configOne;

    private String configTwo;

    @Override
    public void run()
    {
    }
}

对象myDAO已经存在于ApplicationContext中,我希望Spring为我实现这种依赖关系。确实,此类的任何实例都不应仅知道它需要配置参数FileProcessconfigOne

即可真正了解configTwo的内部。

要获取FileProcess的实例,我使用了getBean()的{​​{1}}方法,但是我无法仅传递配置参数:

ApplicationContext

这会导致错误:

final FileProcess fileProcess = this.applicationContext.getBean(FileProcess.class, configOne, configTwo)

我发现无论我添加到Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities的什么构造函数中,我都会遇到相同的错误。我只想传递配置参数,而不是FileProcess的实例。同样,必须传递MyDAO实例意味着调用者必须了解MyDAO的内部知识,并且通常必须知道此类bean的范围。

有没有一种方法可以实现这一目标而不必诉诸FileProcess类和带有@Configuration注释的方法?

1 个答案:

答案 0 :(得分:1)

我认为最好使用工厂bean,例如

@Bean
BiFunction<String, String, FileProcess> createFileProcess(MyDAO dao) {
    return (c1, c2) -> {
        FileProcess result = new FileProcess(dao) ;
        result.setConfig1(c1);
        result.setConfig2(c2);
        return result;
   };
}

这在配置类中,您可以将其自动装配以使用配置值创建过程对象。

@Autowired
BiFunction<String, String, FileProcess> processFactory;
... 
FileProcess p = processFactory.apply("val1", "val2");
相关问题