在我的应用程序中,我想按需实例化一个类,并将一些运行时参数传递给,并使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
和configOne
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
注释的方法?
答案 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");