0

在我的应用程序中,我想按需实例化一个类并将一些运行时参数传递给 is 以及让 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 为我实现这种依赖关系。事实上,这个类的任何实例都不应该真正知道它的内部结构FileProcess,它只需要配置参数configOneconfigTwo

要获得一个实例,FileProcess我使用了 的getBean()方法,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并且通常必须了解此类 bean 的范围。

有没有一种方法可以实现这一点而不必求助于@Configuration类和带@Bean注释的方法?

4

1 回答 1

1

我认为你最好用工厂豆,比如

@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");
于 2020-01-19T14:59:03.093 回答