Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用运行时定义的配置按需实例化Bean_Java_Spring_Spring Context - Fatal编程技术网

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

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

在我的应用程序中,我希望根据需要实例化一个类,并将一些运行时参数传递给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
的内部结构,只需要配置参数
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()
自动关联依赖项。