From 98ad52a826d55d29ef15543abd308b5b9c196953 Mon Sep 17 00:00:00 2001 From: Rikako Wu <496063163@qq.com> Date: Wed, 20 Jul 2022 22:55:41 +0800 Subject: [PATCH] daily commit --- spring/Spring core/SpEL.md | 109 ++++++++++++++++++++++++++ spring/Spring core/Spring Core AOP.md | 5 +- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 spring/Spring core/SpEL.md diff --git a/spring/Spring core/SpEL.md b/spring/Spring core/SpEL.md new file mode 100644 index 0000000..b91a3af --- /dev/null +++ b/spring/Spring core/SpEL.md @@ -0,0 +1,109 @@ +# SpEL(Spring Expression Language) +- ## SpEL的用法 + - SpEL如何将表达式从字符串转化为计算后的值 + - 在转化过程中,在parseExpression方法执行时可能会抛出ParseException异常,在执行getValue方法时可能会抛出EvaluationException + ```java + ExpressionParser parser = new SpelExpressionParser(); + Expression exp = parser.parseExpression("'Hello World'"); + String message = (String) exp.getValue(); + ``` + - 在SpEL中获取String的字节数组 + ```java + ExpressionParser parser=new SpelExpressionParser(); + Expression exp=parser.parseExpression("'Hello World'.bytes"); + byte[] bytes=(byte[])exp.getValue(); + ``` + - 在调用Expression类型的getValue方法时,可以不用进行强制类型转换,而是在getValue方法中传入一个Class参数,返回值将会被自动转换成Class对应的目标类型,当转换失败时会抛出EvaluationException + ```java + ExpressionParser parser=new SpelExpressionParser(); + Expression exp=parser.parseExpression("'Hello World'.bytes.length"); + Integer bytes=exp.getValue(Integer.class); + ``` + - SpEL可以针对特定的对象,给出一个表达式并且在getValue方法中传入一个对象,那么表达式中的变量将会针对该对象中的特定属性 + ```java + // 如下步骤会比较waifu对象的name属性是否为"touma"字符串 + ExpressionParser parser=new SpelExpressionParser(); + Expression exp=parser.parseExpression("name=='touma'"); + Boolean equals=exp.getValue(waifu,Boolean.class); + ``` + - 可以为parser设置一个parserconfiguration,用于处理当列表或集合元素的index操作超过集合长度时的默认行为 + ```java + class Demo { + public List list; + } + + // Turn on: + // - auto null reference initialization + // - auto collection growing + SpelParserConfiguration config = new SpelParserConfiguration(true, true); + + ExpressionParser parser = new SpelExpressionParser(config); + + Expression expression = parser.parseExpression("list[3]"); + + Demo demo = new Demo(); + + Object o = expression.getValue(demo); + + // demo.list will now be a real collection of 4 entries + // Each entry is a new empty String + ``` +- ## SpEL在bean对象定义时的使用 + - 在使用@Value注解时,可以结合SpEL表达式进行使用,@Value注解可以运用在域变量、方法、方法和构造器的参数上。@Value会指定默认值 +- ## SpEL对List、Map的支持 + - 可以通过{}来直接表示list + ```java + List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue(context); + + List listOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue(context); + ``` + - 可以通过{key:value}形式来直接表示map,空map用{:}来进行表示 + ```java + // evaluates to a Java map containing the two entries + Map inventorInfo = (Map) parser.parseExpression("{name:'Nikola',dob:'10-July-1856'}").getValue(context); + + Map mapOfMaps = (Map) parser.parseExpression("{name:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}").getValue(context); + ``` + - 可以通过new int[]{}的形式为SpEL指定数组 + ```java + int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue(context); + + // Array with initializer + int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue(context); + + // Multi dimensional array + int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue(context); + ``` +- ## SpEL支持的特殊操作符 + - instanceof + ```java + boolean falseValue = parser.parseExpression( + "'xyz' instanceof T(Integer)").getValue(Boolean.class); + ``` + - 正则表达式 + ```java + boolean trueValue = parser.parseExpression( + "'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class); + ``` + - 类型操作符,获取类型的Class对象、调用静态方法 + ```java + Class dateClass = parser.parseExpression("T(java.util.Date)").getValue(Class.class); + + Class stringClass = parser.parseExpression("T(String)").getValue(Class.class); + + boolean trueValue = parser.parseExpression( + "T(java.math.RoundingMode).CEILING < T(java.math.RoundingMode).FLOOR") + .getValue(Boolean.class); + ``` + - new操作符: + - 可以在SpEL表达式中通过new操作符来调用构造器,但是除了位于java.lang包中的类,对其他的类调用构造器时都必须指定类的全类名 + ```java + Inventor einstein = p.parseExpression( + "new org.spring.samples.spel.inventor.Inventor('Albert Einstein', 'German')") + .getValue(Inventor.class); + + // create new Inventor instance within the add() method of List + p.parseExpression( + "Members.add(new org.spring.samples.spel.inventor.Inventor( + 'Albert Einstein', 'German'))").getValue(societyContext); + ``` \ No newline at end of file diff --git a/spring/Spring core/Spring Core AOP.md b/spring/Spring core/Spring Core AOP.md index 3a595a0..8825d25 100644 --- a/spring/Spring core/Spring Core AOP.md +++ b/spring/Spring core/Spring Core AOP.md @@ -165,6 +165,9 @@ // 之后,可以直接通过this(ref)在pointcut表达式中获取服务对象,也可以通过getBean方法获取容器中的对象 } ``` - +- ## @RestControllerAdvice的使用 + - @RestControllerAdvice是@Componnent注解的一个特例,@RestControllerAdivce注解的组成包含@Component + - @RestControllerAdivce组合了@ControllerAdvice和@ResponseBody两个注解 + - 通常,@RestControllerAdvice用作为spring mvc的所有方法做ExceptionHandler