目的:为了给 Spring 社区提供一种产品无缝对接的表达式语言。可以在运行时查询和操作对象。
使用方法:
xml中
<!-- 给NumberGuess类中的randomNumber属性用SpEL表达式赋值一个随机数 -->
<bean id="numberGuess" class="org.spring.samples.NumberGuess">
<property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
</bean>
<!--systemProperties是系统预定义的,去一个变量的值赋值给defaultLocale-->
<bean id="taxCalculator" class="org.spring.samples.TaxCalculator">
<property name="defaultLocale" value="#{ systemProperties['user.region'] }"/>
</bean>
<!--直接引用上面的NumberGuess的randomNumber进行赋值-->
<bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
<property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
</bean>
注解中 ```java /**
- 给一个字段设置默认值 */ public class FieldValueTestBean { @Value(“#{ systemProperties[‘user.region’] }”) private String defaultLocale; }
/**
- 给set的方法上设置默认值 */ public class PropertyValueTestBean { private String defaultLocale; @Value(“#{ systemProperties[‘user.region’] }”) public void setDefaultLocale(String defaultLocale) { this.defaultLocale = defaultLocale; } }
/**
- 方法的参数上赋值 */ public class SimpleMovieLister { private String defaultLocale; @Autowired public void configure(@Value(“#{ systemProperties[‘user.region’] }”) String defaultLocale) { this.defaultLocale = defaultLocale; } // … } ```
- 直接使用
ExpressionParser.class
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();
System.out.println(message);
}
在 Spring 的主要使用场景
- JPA的支持
根据指定的Repository自动插入相关的entityName。有两种方式能被解析出来:1)如果定了了@Entity注解,直接用其属性名。2)如果没定义,直接用实体的类的名称
@Entity("User")
public class User {
@Id
@GeneratedValue
Long id;
String lastname;
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from #{#entityName} u where u.lastname = ?1")
List<User> findByLastname(String lastname);
}
- Spring Cachae
@Cacheable(value = "reservationsCache", key = "#restaurand.id", sync = true)
public List<Reservation> getReservationsForRestaurant( Restaurant restaurant ) {
}
@Cacheable(value = "userCache", unless = "#result != null",condition=”#id>0”)
public User getUserById( long id ) {
return userRepository.getById( id );
}
参考: