※基本
ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression("'Hello World'"); String message = (String) exp.getValue(); System.out.println(message); Expression exp2 = parser.parseExpression("new String('Hello World')"); String message2 = exp2.getValue(String.class); System.out.println(message2); System.out.println(parser.parseExpression("'Hello World'.concat('!')").getValue()); System.out.println(parser.parseExpression("'Hello World' + 'Mary' ").getValue()); System.out.println(parser.parseExpression("'Hello World'.replace('World', 'Mary')").getValue()); Expression b = parser.parseExpression("'Hello World'.bytes"); byte[] bytes = (byte[]) b.getValue(); System.out.println(bytes[1]);// 101-->e的ascii為101
※結果:
Hello World
Hello World
Hello World!
Hello WorldMary
Hello Mary
101
※在parseExpression("")裡面的空間就好像是寫java的環境一樣(也類似javascript的eval()),可以把它想像成Eclipse,所以字一定要用「"」或「'」包起來,而最外面已經是「"」了,所以只好用跳脫字元「\"」或「'」
※exp要強轉,exp2已經寫在getValue裡了,所以可以不用強轉
※裡面已經是eclipse了,所以eclipse怎麼操作,裡面就怎麼操作
※取得屬性
XXX.java
public class XXX { public String ooo = "OOO"; }
測試類
ExpressionParser p1 = new SpelExpressionParser(); Expression e = p1.parseExpression("ooo"); EvaluationContext context = new StandardEvaluationContext(new XXX()); System.out.println(e.getValue(context)); Expression ex1 = p1.parseExpression("ooo == 'OOO'"); Expression ex2 = p1.parseExpression("ooo.equals('OOO')"); System.out.println(ex1.getValue(context, Boolean.class)); System.out.println(ex2.getValue(context, Boolean.class)); ExpressionParser p2 = new SpelExpressionParser(); Expression exp = p2.parseExpression("ooo"); System.out.println(exp.getValue(new XXX())); Expression ex3 = p2.parseExpression("ooo == 'OOO'"); Expression ex4 = p2.parseExpression("ooo.equals('OOO')"); System.out.println(ex3.getValue(new XXX(), Boolean.class)); System.out.println(ex4.getValue(new XXX(), Boolean.class));
※結果:
OOO
true
true
OOO
true
true
※p1多一個EvaluationContext,然後new個建構子在裡面; 而p2直接將建構子放在getValue裡
※取代
XXX.java
public class XXX { public List<String> ooo = new ArrayList<String>(); }
測試類
XXX xxx = new XXX(); xxx.ooo.add("abc"); StandardEvaluationContext context = new StandardEvaluationContext(xxx); // new SpelExpressionParser().parseExpression("ooo[0]").setValue(context, "def"); System.out.println(xxx.ooo.get(0));
※將註解那行打開就可以取代了,但只能取代,不能新增
另一種方式
List<String> aaa = new ArrayList<String>(); aaa.add("ghi"); EvaluationContext ec = new StandardEvaluationContext(aaa); ec.setVariable("listAaa", aaa); new SpelExpressionParser().parseExpression("#listAaa[0]").setValue(ec, "jkl"); System.out.println(aaa.get(0));
※這種方式是在EvaluationContext設定一個變數名稱,使用時必須在前前加上「#」
※XML
Book.java和Comic.java
public class Book { private Double randomPrice1; private Double randomPrice2; private String display; private String copy; // setter/getter... } public class Comic { private String comicName; // setter/getter... }
applicationContext.xml
<bean id="co" class="vo.Comic" p:comicName="#{'七龍珠a'}" /> <bean id="bo" class="vo.Book" p:display="#{systemProperties['java.vendor.url']}"> <property name="randomPrice1" value="#{T(java.lang.Math).random() * 100.0}" /> <property name="randomPrice2" value="#{T(java.lang.Double).valueOf(T(java.lang.Math).random() * 100.0).intValue()}" /> <property name="copy" value="#{co.comicName.toUpperCase()}" /> </bean>
測試類
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println(ctx.getBeanDefinitionCount()); for (String s : ctx.getBeanDefinitionNames()) { System.out.println(s); } Book book1 = ctx.getBean("bo", Book.class); System.out.println(book1.getRandomPrice1()); System.out.println(book1.getRandomPrice2()); System.out.println(book1.getDisplay()); System.out.println(book1.getCopy()); ((ClassPathXmlApplicationContext) ctx).close();
※結果:
2
co
bo
64.00558669972638
83.0
http://java.oracle.com/
七龍珠A
※在XML裡一律都用「#{}」,語法寫在裡面
※randomPrice1小數點後面很多,而randomPrice2用T(java.lang.Double).valueOf().intValue()可以去掉小數點
※display的systemProperties['java.vendor.url'],裡面的字,可以用System.getProperties().list(System.out);,印出來是key=value,裡面的字打key,顯示出來就是value的值
※copy可以直接取id裡面的屬性,然後還可以再「.」方法
※方法之前不用「()」,現在都要加
※取得properties
kv.properties
key=value a=apple b=blueberry
applicationContext.xml
<util:properties id="keyValue" location="classpath:kv.properties" /> <bean id="bo" class="vo.Book" > <property name="copy" value="#{keyValue.a.toUpperCase()}" /> </bean>
※Annotation
applicationContext.xml要開啟<context:component-scan base-package="\">Comic.java
@Component("co") public class Comic { @Value("七龍珠a") private String comicName; // setter/getter... }
Book.java
@Component("bo") public class Book { @Value("#{T(java.lang.Math).random() * 100.0}") private Double randomPrice1; @Value("#{T(java.lang.Double).valueOf(T(java.lang.Math).random() * 100.0).intValue()}") private Double randomPrice2; @Value("#{systemProperties['java.vendor.url']}") private String display; @Value("#{co.comicName.toUpperCase()}") private String copy; // setter/getter... }
※剛剛的xml設定變成Annotation後變成這樣子,@Value也可以寫在setter上
沒有留言:
張貼留言