Java 使用运行时定义的配置按需实例化Bean
在我的应用程序中,我希望根据需要实例化一个类,并将一些运行时参数传递给is,同时让Spring自动满足任何Java 使用运行时定义的配置按需实例化Bean,java,spring,spring-context,Java,Spring,Spring Context,在我的应用程序中,我希望根据需要实例化一个类,并将一些运行时参数传递给is,同时让Spring自动满足任何@Autowired依赖项。例如,我想按需实例化的类: @Service @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class FileProcess implements Runnable { @Autowired private MyDAO myDAO; private Stri
@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
的实例,我使用了ApplicationContext
的getBean()
方法,但我无法只传入配置参数:
final FileProcess fileProcess = this.applicationContext.getBean(FileProcess.class, configOne, configTwo)
这将导致以下错误:
无法解析匹配的构造函数(提示:为简单参数指定索引/类型/名称参数以避免类型歧义
我发现,无论我向FileProcess
添加什么构造函数,我都会遇到同样的错误。我只想传入配置参数,而不是在本例中传入MyDAO的实例。同样,传入MyDAO的实例意味着调用方必须了解FileProce的内部结构ss
通常必须了解此类bean的范围
有没有一种方法可以实现这一点,而不必求助于@Configuration
类和@Bean
注释方法?我认为最好使用工厂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;
};
}
@Bean
双功能createFileProcess(MyDAO){
返回(c1,c2)->{
FileProcess结果=新的FileProcess(dao);
结果:setConfig1(c1);
结果:setConfig2(c2);
返回结果;
};
}
这是一个配置类,您可以将其自动关联以使用配置值创建流程对象
@Autowired
BiFunction<String, String, FileProcess> processFactory;
...
FileProcess p = processFactory.apply("val1", "val2");
@Autowired
双功能加工厂;
...
FileProcess p=processFactory.apply(“val1”、“val2”);
创建配置字段的setter和Dao的构造函数,然后您可以在@Bean
方法中创建它。如果我这样做了,我已经正确地理解了您,我相信我不能使用getBean()
方法自动注入MyDAO
,因为它会导致循环引用,我不想传入DAO,因为我需要知道它的作用域虽然这不是我解决它的方式,但您的答案是我解决方案的基础。在上面,您已经针对我的特定情况解决了问题,并使用了双功能
类型I exte我用getInstance
创建了一个工厂类,而不是BiFunction
。工厂类被注释为服务,我可以使用getInstance
中的ApplicationContext.getBean()
自动关联依赖项。