WebServer/Spring

[Spring] SpEL (Spring Expression Language)

gangintheremark 2023. 9. 14. 09:44
728x90

SpEL (Spring Expression Language) 이란 런타임에 평가하는 표현식을 이용하여 빈의 프로퍼티나 생성자 인자에 값을 할당하는 간결한 방식이다. xml 파일에서 속성값을 #{표현식} 이용하여 설정

 

리터럴 값

<bean id="" class="">
    <property name= "count" value="#{5}" />
    <property name= "count" value="#{89.5}" />
    <property name= "username" value="#{'홍길동'}"/>
    <property name= "enabled" value="#{10>3} />
</bean>

 

연산

  • 산술 연산자 : + - * / % ^
  • 관계 연산자 : == > < lt gt eq le ge
  • 논리 연산자 : and or not !
  • 조건 연산자 : ? :
  • 정규 표현식 : matches
value="#{1+2}"
value="#{1>2}"

 

빈, 메서드, property 참조

SpEL 문법으로 다른 빈을 참고할 때는 ref 대신에 value 사용

value="#{빈id값}"
value="#{빈id값.변수}"
value="#{빈id값.메서드()}"
<bean id="cat1" class="com.dto.Cat">
    <property name="username" value="애용이"/>
    <property name="age" value="4"/>
</bean>

<!-- SpEL을 사용하여 id로 접근 가능 -->
<bean id="p1" class="com.dto.Person">
    <property name="username" value="빵빵이"/>
    <property name="cat" value="#{cat1}"/>
</bean>

<!-- SpEL을 사용하여 property 및 메서드 접근 가능 -->
<bean id="cat2" class="com.dto.Cat">
    <property name="cname" value="#{cat1.name}"/>
    <property name="cage" value="#{cat1.getAge()}" />
</bean>

 

상수 및 static 메서드 참조

value="#{T(패키지명포함한클래스명).메서드()}"
<bean id="" class="">
    <property name="age" value="#{T(java.lang.Math).random()*100}"/>
</bean>

 

리소스 번들(properties) 참조

value="#{번들의id값['key']}"
<context:annotation-config />
<util:properties id="xxx" location="classpath:com/config/application.properties" />
<bean id="cat1" class="com.dto.Cat">
    <property name="name" value="#{xxx['cat.name']}"/>
    <property name="age" value="#{xxx['cat.age']}"/>
</bean>

 

컬렉션의 selection

.?[조건식] 기준을 만족하는 만 포함하는 새로운 컬렉션 생성

value="#{컬렉션id값.?[조건식]}"
<util:list id="xxx">
    <bean id="c1" class="com.dto.Cat" p:username="야옹이1" p:age="2" p:married="true" p:height="45.6"/>
    <bean id="c2" class="com.dto.Cat" p:username="야옹이2" p:age="5" p:married="false" p:height="15.6"/>
    <bean id="c3" class="com.dto.Cat" p:username="야옹이3" p:age="10" p:married="false" p:height="25.6"/>
    <bean id="c4" class="com.dto.Cat" p:username="야옹이4" p:age="9" p:married="false" p:height="21.2"/>
</util:list>

<bean id="p1" class="com.dto.Person">
    <property name="catList" value="#{xxx}" />
</bean>
<bean id="p2" class="com.dto.Person">
    <property name="catList" value="#{xxx[1]}" />
</bean>
<bean id="p3" class="com.dto.Person">
    <property name="catList" value="#{xxx.?[age lt 10]}" />
</bean>
<bean id="p4" class="com.dto.Person">
    <property name="catList" value="#{xxx.?[age lt 10 and married==false]}" />
</bean>

 

컬렉션의 projection

컬렉션 목록에서 특정 값 .![변수명] 만 가져올 때 사용

value="#{컬렉션id값.![변수명]}"
<bean id="p1" class="com.dto.Person">
    <property name="catList" value="#{xxx}" />
</bean>

<bean id="p2" class="com.dto.Person">
    <property name="usernameList" value="#{xxx.![username]}" />
</bean>

<!-- 컬렉션의 selection + projection -->
<bean id="p3" class="com.dto.Person">
    <property name="usernameList" value="#{xxx.?[age lt 5].![username]}" />
</bean>
728x90