在构造函数中带有@Value的FactoryBean?

时间:2018-04-30 13:56:50

标签: java spring

是否可以向FactoryBean添加非空的默认构造函数,其中参数由@Value注入?

@Service
public class DateTimeFormatterFactory implements FactoryBean<DateTimeFormatter> {
    private DateTimeFormatter formatter;

    @Autowired
    public DateTimeFormatterFactory(@Value("${custom.format}") String format) {
        formatter = DateTimeFormatter.ofPattern(format);
    }

    @Override
    public DateTimeFormatter getObject() {
        return formatter;
    }

    @Override
    public Class<?> getObjectType() {
        return DateTimeFormatter.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

/ edit:我应该添加错误消息。 Spring抱怨没有参数的“默认”构造函数。但是如果我添加一个,那么我的@Value构造函数永远不会被调用...

1 个答案:

答案 0 :(得分:1)

是, 但是你不需要构造函数参数。

相反, 您可以创建PostConstruct方法 并在其中初始化格式化程序。

例如,

@Value("${custom.format}")
private String desiredDateFormat;

@PostConstruct
public void postConstruct()
{
    formatter = DateTimeFormatter.ofPattern(desiredDateFormat);
}

选项2 (A.K.A对评论的回应)

如果您只需要value来创建DateTimeFormatter, 然后用它来创建一个DateTimeFormatter “setter-like”方法,我称之为“长椅” (因为我不知道该怎么称呼它)。 这是一些代码:

@Value("${custom.format}")
public void createDateTimeFormatter(
    final String desiredDateFormat)
{
    formatter = DateTimeFormatter.ofPattern(desiredDateFormat);
}