※操作集合
※XML設定
XXX.java和Book.java
public class XXX { public List<String> l = new ArrayList<>(3); public Map<String, String> m = new HashMap<>(3); // setter/getter... public XXX() { l.add("a"); l.add("b"); l.add("c"); m.put("A", "1"); m.put("B", "2"); m.put("C", "3"); } } public class Book { private String cList; private String cMap; private Map<String, String> map; // setter/getter... }
applicationContext.xml
<bean id="xxx" class="vo.XXX" /> <bean id="bo" class="vo.Book" p:map="#{xxx.m}"> <property name="cList" value="#{xxx.l[1]}" /> <property name="cMap" value="#{xxx.m['C']}" /> </bean>
測試類
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println(ctx.getBeanDefinitionCount()); for (String s : ctx.getBeanDefinitionNames()) { System.out.println(s); } Book book = ctx.getBean("bo", Book.class); System.out.println(book.getcList()); System.out.println(book.getcMap()); System.out.println(book.getMap()); ((ClassPathXmlApplicationContext) ctx).close();
※Annotation設定
XXX.java只要在最上面加上@Component("xxx"),如果不想「()」,那就是大寫的「XXX」,xml要開啟如果打錯spring就起不來了,可以將xxx相關的都註解掉,然後將測試類的bo全註解掉,看run起來時是抓到什麼bean
Book.java
@Component("bo") public class Book { @Value("#{xxx.l[1]}") private String cList; @Value("#{xxx.m['C']}") private String cMap; @Value("#{xxx.m}") private Map<String, String> map; // setter/getter... }
※三元運算子
xxx != null ? xxx:"ooo";這是一般的寫法,xxx會重覆,所以SpEL又增加一種如下的寫法
xxx ?: "ooo"
原本的三元運算子還是可以用
※安全導航操作
foo.bar,這樣子寫有可能會導致NullPoint Exception,所以SpEL用一種特殊的寫法可以將它變成字串null,如下:foo?.bar
※建構子
public class XXX { private String a; public XXX() { } public XXX(String a) { this.a = a; } public String getA() { return a; } } ExpressionParser parser = new SpelExpressionParser(); XXX xxx = parser.parseExpression("new vo.XXX('aaa')").getValue(XXX.class); System.out.println(xxx.getA());
※#this和#root
ExpressionParser parser = new SpelExpressionParser(); EvaluationContext ctx = new StandardEvaluationContext(); ctx.setVariable("v", "A"); ctx.setVariable("v", "B"); String rtn1 = parser.parseExpression("#v").getValue(ctx, String.class); System.out.println(rtn1); ctx = new StandardEvaluationContext("C"); String rtn2 = parser.parseExpression("#root").getValue(ctx, String.class); System.out.println(rtn2); String rtn3 = parser.parseExpression("#this").getValue(ctx, String.class); System.out.println(rtn3); System.out.println(parser.parseExpression("#root='D'").getValue(ctx, String.class)); System.out.println(parser.parseExpression("#this='E'").getValue(ctx, String.class));
※結果:
B
C
C
D
E
※兩者看起來差不多,再看一個例子
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17); ExpressionParser parser = new SpelExpressionParser(); // #this EvaluationContext ctx = new StandardEvaluationContext(); ctx.setVariable("primes", primes); @SuppressWarnings("unchecked") List<Integer> rtn = parser.parseExpression("#primes.?[#this gt 10]").getValue(ctx, List.class); // #root // EvaluationContext ctx = new StandardEvaluationContext(primes); // @SuppressWarnings("unchecked") // List<Integer> rtn = parser.parseExpression("#root.?[#this gt 10]").getValue(ctx, List.class); // -------------------------------------- System.out.println(parser.parseExpression("#root").getValue(ctx, String.class)); System.out.println(parser.parseExpression("#this").getValue(ctx, String.class)); for (Integer i : rtn) { System.out.println(i); }
※「.?」是選集合的意思,和安全導航操作的「?.」剛好相反,不要搞錯了
※結果:
null
null
11
13
17
※如果#this註解,#root打開的結果如下:
2,3,5,7,11,13,17
2,3,5,7,11,13,17
11
13
17
※看結果也是很像,但表達式裡使用#this不能使用root; 而使用#root不能使用primes(廢話)
要使用root時,必須在StandardEvaluationContext()參數裡塞值才有東西
※集合投影(.!)
就是迭代集合後,做一些操作XXX.java和上面一樣
XXX xxx = new XXX(); List<String> ls = xxx.getL(); Map<String, String> ms = xxx.getM(); ExpressionParser parser = new SpelExpressionParser(); EvaluationContext ctx = new StandardEvaluationContext(); ctx.setVariable("l", ls); ctx.setVariable("m", ms); @SuppressWarnings("unchecked") List<String> rtnList = parser.parseExpression("#l.![#this+1]").getValue(ctx, List.class); System.out.println(rtnList.iterator().next()); System.out.println("-----"); @SuppressWarnings("unchecked") List<String> rtnMap1 = parser.parseExpression("#m.![#this.key + 1]").getValue(ctx, List.class); Iterator<String> it1 = rtnMap1.iterator(); while (it1.hasNext()) { System.out.println(it1.next()); } System.out.println("-----"); @SuppressWarnings("unchecked") List<String> rtnMap2 = parser.parseExpression("#m.![#this.value+1]").getValue(ctx, List.class); Iterator<String> it2 = rtnMap2.iterator(); while (it2.hasNext()) { System.out.println(it2.next()); }
※取map時,可以取key或value,用#this.key和#this.value,但#this可以不打,變成key+1和value+1
沒有留言:
張貼留言