Bean 定義中的表達式
您可以使用 SpEL 表達式搭配組態中繼資料,以定義 Bean 實例。在這兩種情況下,定義表達式的語法形式為 #{ <expression string> }
。
應用程式 Context 中的所有 Bean 都可以作為預定義變數使用,並帶有其通用 Bean 名稱。這包括標準 Context Bean,例如 environment
(類型為 org.springframework.core.env.Environment
),以及 systemProperties
和 systemEnvironment
(類型為 Map<String, Object>
),用於存取執行時期環境。
若要指定預設值,您可以將 @Value
註解放在欄位、方法和方法或建構子參數(或 XML 等效項)上。
以下範例設定欄位的預設值
-
Java
-
Kotlin
public class FieldValueTestBean {
@Value("#{ systemProperties['user.region'] }")
private String defaultLocale;
public void setDefaultLocale(String defaultLocale) {
this.defaultLocale = defaultLocale;
}
public String getDefaultLocale() {
return this.defaultLocale;
}
}
class FieldValueTestBean {
@field:Value("#{ systemProperties['user.region'] }")
lateinit var defaultLocale: String
}
請注意,您在此處不必在預定義變數前加上 #
符號。
以下範例顯示了等效的屬性 Setter 方法
-
Java
-
Kotlin
-
Xml
public class PropertyValueTestBean {
private String defaultLocale;
@Value("#{ systemProperties['user.region'] }")
public void setDefaultLocale(String defaultLocale) {
this.defaultLocale = defaultLocale;
}
public String getDefaultLocale() {
return this.defaultLocale;
}
}
class PropertyValueTestBean {
@set:Value("#{ systemProperties['user.region'] }")
lateinit var defaultLocale: String
}
<bean id="testBean" class="org.springframework.docs.core.expressions.expressionsbeandef.PropertyValueTestBean">
<property name="defaultLocale" value="#{ systemProperties['user.region'] }"/>
</bean>
自動裝配的方法和建構子也可以使用 @Value
註解,如下列範例所示
-
Java
-
Kotlin
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;
}
// ...
}
class SimpleMovieLister {
private lateinit var movieFinder: MovieFinder
private lateinit var defaultLocale: String
@Autowired
fun configure(movieFinder: MovieFinder,
@Value("#{ systemProperties['user.region'] }") defaultLocale: String) {
this.movieFinder = movieFinder
this.defaultLocale = defaultLocale
}
// ...
}
-
Java
-
Kotlin
-
Xml
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;
}
// ...
}
class MovieRecommender(private val customerPreferenceDao: CustomerPreferenceDao,
@Value("#{systemProperties['user.country']}")
private val defaultLocale: String) {
// ...
}
<bean id="testBean" class="org.springframework.docs.core.expressions.expressionsbeandef.MovieRecommender">
<constructor-arg ref="customerPreferenceDao"/>
<constructor-arg value="#{ systemProperties['user.country'] }"/>
</bean>
您也可以依名稱參考其他 Bean 屬性,如下列範例所示
-
Java
-
Kotlin
-
Xml
public class ShapeGuess {
private double initialShapeSeed;
@Value("#{ numberGuess.randomNumber }")
public void setInitialShapeSeed(double initialShapeSeed) {
this.initialShapeSeed = initialShapeSeed;
}
public double getInitialShapeSeed() {
return initialShapeSeed;
}
}
class ShapeGuess {
@set:Value("#{ numberGuess.randomNumber }")
var initialShapeSeed: Double = 0.0
}
<bean id="shapeGuess" class="org.springframework.docs.core.expressions.expressionsbeandef.ShapeGuess">
<property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
</bean>