跳到主要内容

Bean 定义中的表达式

ChatGPT-4o-mini 中英对照 Expressions in Bean Definitions

您可以使用 SpEL 表达式与配置元数据来定义 bean 实例。在这两种情况下,定义表达式的语法形式为 #{ <expression string> }

应用上下文中的所有 bean 都可以作为预定义变量使用,变量名为它们的公共 bean 名称。这包括标准上下文 bean,例如 environment(类型为 org.springframework.core.env.Environment),以及 systemPropertiessystemEnvironment(类型为 Map<String, Object>),用于访问运行时环境。

要指定默认值,您可以将 @Value 注解放在字段、方法以及方法或构造函数参数(或 XML 等效项)上。

以下示例设置字段的默认值:

public class FieldValueTestBean {

@Value("#{ systemProperties['user.region'] }")
private String defaultLocale;

public void setDefaultLocale(String defaultLocale) {
this.defaultLocale = defaultLocale;
}

public String getDefaultLocale() {
return this.defaultLocale;
}
}
java

请注意,您在这里不必在预定义变量前加上 # 符号。

以下示例显示了在属性设置方法上的等效内容:

public class PropertyValueTestBean {

private String defaultLocale;

@Value("#{ systemProperties['user.region'] }")
public void setDefaultLocale(String defaultLocale) {
this.defaultLocale = defaultLocale;
}

public String getDefaultLocale() {
return this.defaultLocale;
}
}
java

@Autowired 方法和构造函数也可以使用 @Value 注解,如下例所示:

public class SimpleMovieLister {

private MovieFinder movieFinder;
private String defaultLocale;

@Autowired
public void configure(MovieFinder movieFinder,
@Value("#{ systemProperties['user.region'] }") String defaultLocale) {
this.movieFinder = movieFinder;
this.defaultLocale = defaultLocale;
}

// ...
}
java
public class MovieRecommender {

private String defaultLocale;

private CustomerPreferenceDao customerPreferenceDao;

public MovieRecommender(CustomerPreferenceDao customerPreferenceDao,
@Value("#{systemProperties['user.country']}") String defaultLocale) {
this.customerPreferenceDao = customerPreferenceDao;
this.defaultLocale = defaultLocale;
}

// ...
}
java

您还可以通过名称引用其他 bean 属性,如下例所示:

public class ShapeGuess {

private double initialShapeSeed;

@Value("#{ numberGuess.randomNumber }")
public void setInitialShapeSeed(double initialShapeSeed) {
this.initialShapeSeed = initialShapeSeed;
}

public double getInitialShapeSeed() {
return initialShapeSeed;
}
}
java