Java 仅当bean作为方法参数存在时,Spring autowire

Java 仅当bean作为方法参数存在时,Spring autowire,java,spring,spring-boot,Java,Spring,Spring Boot,我正在使用@ConditionalOnProperty创建文件压缩程序bean: @Bean @ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", matchIfMissing = true) public FileCompressor fileCompressor() { return new DefaultFileCompressor(...); } 我只想在存在的情况下自动连接FileCo

我正在使用
@ConditionalOnProperty
创建
文件压缩程序
bean:

@Bean
@ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", matchIfMissing = true)
public FileCompressor fileCompressor() {
    return new DefaultFileCompressor(...);
}
我只想在存在的情况下自动连接
FileCompressor
bean,
null
if
file.rollover.sink.compress=false
作为方法参数。 但如果我试着这样定义它:

@Bean
public RolloverTask rolloverTask(final IntervalCalculator intervalCalculator, final @Autowired(required = false) FileCompressor fileCompressor) {
    return new RolloverTask(intervalCalculator, fileCompressor);
}
我得到以下错误:

Parameter 1 of method rolloverTask in com.example.FileRolloverSinkConfiguration required a bean of type 'com.example.compressor.FileCompressor' that could not be found.
    - Bean method 'fileCompressor' in 'FileRolloverSinkConfiguration' not loaded because @ConditionalOnProperty (file.rollover.sink.compress) found different value in property 'compress'
如果不存在,我应该对autowire或pass
null
进行哪些更改

--编辑--

我的解决方案:

private FileCompressor fileCompressor;

@Autowired(required = false)
public void setFileCompressor(final FileCompressor fileCompressor) {
    this.fileCompressor = fileCompressor;
}


@Bean
public RolloverTask rolloverTask(final IntervalCalculator intervalCalculator) {
        log.info("Creating a new rollover task with{} a file compressor", fileCompressor == null ? "out" : "");
        return new RolloverTask(intervalCalculator, fileCompressor);
}

@Bean
@ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", matchIfMissing = true)
public FileCompressor fileCompressor() {
    return new DefaultFileCompressor(...);
}

我认为您可以使用注释
@ConditionalOnBean
@ConditionalOnMissingBean

我没有尝试代码,但应该是这样的:

@Bean
@ConditionalOnBean(FileCompressor.class)
public RolloverTask rolloverTask(final IntervalCalculator intervalCalculator, final FileCompressor fileCompressor) {
    return new RolloverTask(intervalCalculator, fileCompressor);
}


如果没有
havingValue=
,则使用
matchIfMissing=true
是没有意义的。因为若你们并没有一个属性,那个么bean就会被创建,若你们有一个具有任何值的属性,那个么bean就会被创建

您可以通过以下方式解决此问题:

    @Autowired(required = false)
    private FileCompressor fileCompressor;

    @Bean
    public RolloverTask rolloverTaskWithCompressor(final IntervalCalculator intervalCalculator, final FileCompressor fileCompressor) {
        return new RolloverTask(intervalCalculator, fileCompressor);
   }
或者对两个版本的
RolloverTask
有不同的bean定义:

    @Bean
    @ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", havingValue = "no", matchIfMissing = false)
    public RolloverTask rolloverTask(IntervalCalculator intervalCalculator) {
        return new RolloverTask(intervalCalculator, null);
    }

    @Bean
    @ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", havingValue = "yes", matchIfMissing = true)
    public RolloverTask rolloverTaskWithCompressor(final IntervalCalculator intervalCalculator, final FileCompressor fileCompressor) {
        return new RolloverTask(intervalCalculator, fileCompressor);
   }

我对你的第一个建议采用了类似的解决方案,我不喜欢有两个定义,一个是属性为真,另一个是属性为假。我的bean定义比这个例子要复杂一些。。。我已经把我的解决方案编辑好了。
    @Bean
    @ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", havingValue = "no", matchIfMissing = false)
    public RolloverTask rolloverTask(IntervalCalculator intervalCalculator) {
        return new RolloverTask(intervalCalculator, null);
    }

    @Bean
    @ConditionalOnProperty(prefix = "file.rollover.sink", name = "compress", havingValue = "yes", matchIfMissing = true)
    public RolloverTask rolloverTaskWithCompressor(final IntervalCalculator intervalCalculator, final FileCompressor fileCompressor) {
        return new RolloverTask(intervalCalculator, fileCompressor);
   }