目的:为了给 Spring 社区提供一种产品无缝对接的表达式语言。可以在运行时查询和操作对象。

使用方法:

  • xml中

    1. <!-- 给NumberGuess类中的randomNumber属性用SpEL表达式赋值一个随机数 -->
    2. <bean id="numberGuess" class="org.spring.samples.NumberGuess">
    3. <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
    4. </bean>
    5. <!--systemProperties是系统预定义的,去一个变量的值赋值给defaultLocale-->
    6. <bean id="taxCalculator" class="org.spring.samples.TaxCalculator">
    7. <property name="defaultLocale" value="#{ systemProperties['user.region'] }"/>
    8. </bean>
    9. <!--直接引用上面的NumberGuess的randomNumber进行赋值-->
    10. <bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
    11. <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
    12. </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


  1. public static void main(String[] args) {
  2. ExpressionParser parser = new SpelExpressionParser();
  3. Expression exp = parser.parseExpression("'Hello World'.concat('!')");
  4. String message = (String) exp.getValue();
  5. System.out.println(message);
  6. }

在 Spring 的主要使用场景

  • JPA的支持

    根据指定的Repository自动插入相关的entityName。有两种方式能被解析出来:1)如果定了了@Entity注解,直接用其属性名。2)如果没定义,直接用实体的类的名称

  1. @Entity("User")
  2. public class User {
  3. @Id
  4. @GeneratedValue
  5. Long id;
  6. String lastname;
  7. }
  8. public interface UserRepository extends JpaRepository<User, Long> {
  9. @Query("select u from #{#entityName} u where u.lastname = ?1")
  10. List<User> findByLastname(String lastname);
  11. }
  • Spring Cachae
    1. @Cacheable(value = "reservationsCache", key = "#restaurand.id", sync = true)
    2. public List<Reservation> getReservationsForRestaurant( Restaurant restaurant ) {
    3. }
    4. @Cacheable(value = "userCache", unless = "#result != null",condition=”#id>0”)
    5. public User getUserById( long id ) {
    6. return userRepository.getById( id );
    7. }

参考: