长话短说:
有没有办法解释由以下结果产生的字符串${my.property}
作为一个 SpEL 表达式@Value
不使用转换器的注释,例如就像是@Value("#{${my.property}}
)?
我有一个抽象工厂(简化的),可以让我构建一些公共对象,这些对象是我的系统配置的一部分。
@Component
public class Factory {
public Product makeVal(int x) { return new Product(5); }
}
为了更灵活,我想让用户在中编写SpEL表达式app.properties
文件,以便可以直接访问工厂:
my.property = @Factory.makeVal(12)
现在,在需要此属性的类中,为了实现我的目标,我编写了以下代码。
@Value("#{${my.property}}")
private Product obj;
我以为${my.property}
将被宏观展开,然后由#{}
作为相应的 SpEL 表达式,@Factory.makeVal(12)
在上面的例子中。不幸的是,情况并非如此,加载 Spring 上下文会导致错误,指出它无法转换字符串(属性的值${my.property}
) 到目标类型Product
.
现在,我通过编写一个类来解决这个问题Converter<String, Product>
,但它非常复杂,因为我需要通过实例化以编程方式将字符串评估为 SpEL 表达式ExpressionParser
等等。
但有没有更简单的解决方案呢?是否有一个单一的 SpEL 表达式可以放入@Value
让我简单评估的注释${my.property}
作为 SpEL 表达式本身,可以吗?