Spring SpEL表达式的理解

Spring的IOC本质就一个容器,也就是一个对象的工厂,我们通过配置文件注册我们的Bean对象,通过他进行对象的组装与床架。

SpEL表达式就是一种字符串编程,类似于JS里面的EVAL的作用,通过它可以运行字符串内容

特点:算是一种动态的编程在配置文件(xml配置文件或者注解表达式)--------------------------主流的编程都是基于GUI的开发模式(XML开发模式)里面的动态编程

重点:要是通过拼接字符串作为代码运行,SpEL就可以实现,一些灵活的功能

<bean id="numberGuess" class="org.spring.samples.NumberGuess">
  <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
  <!-- other properties -->
</bean>
<bean id="taxCalculator" class="org.spring.samples.TaxCalculator">
  <property name="defaultLocale" value="#{ systemProperties[‘user.region‘] }"/>
  <!-- other properties -->
</bean>
<bean id="numberGuess" class="org.spring.samples.NumberGuess">
  <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
  <!-- other properties -->
</bean>
<bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
  <property name="initialShapeSeed" value="#{numberGuess.randomNumber }"/>
  <!-- other properties -->
</bean>
ExpressionParser parser = new SpelExpressionParser();
Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
tesla.setPlaceOfBirth(new PlaceOfBirth("Smiljan"));
StandardEvaluationContext context = new StandardEvaluationContext(tesla);
String city = parser.parseExpression("PlaceOfBirth?.City").getValue(context, String.class);
System.out.println(city); // Smiljan
tesla.setPlaceOfBirth(null);
city = parser.parseExpression("PlaceOfBirth?.City").getValue(context, String.class);
System.out.println(city); // null - does not throw NullPointerException!!!

否则:我们就只能通过JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 来编译字符串生成类

package com.test;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class CompileString {
    public static void main(String[] args) throws Exception {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        System.out.println(""+ToolProvider.getSystemJavaCompiler());
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(
                null, null, null);
        StringObject so = new StringObject(
                "CalculatorTest",
                "class CalculatorTest {"
                        + " public int multiply(int multiplicand, int multiplier) {"
                        + " System.out.println(multiplicand);"
                        + " System.out.println(multiplier);"
                        + " return multiplicand * multiplier;" + " }" + "}");
        JavaFileObject file = so;
        Iterable files = Arrays.asList(file);
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
                null, null, null, files);
        Boolean result = task.call();
        System.out.println(result);
        if (result) {
            Class clazz = Class.forName("CalculatorTest");
            Object instance = clazz.newInstance();
            Method m = clazz.getMethod("multiply", new Class[] { int.class,
                    int.class });
            Object[] o = new Object[] { 3, 2 };
            System.out.println(m.invoke(instance, o));
        }
    }
}
class StringObject extends SimpleJavaFileObject {
    private String contents = null;
    public StringObject(String className, String contents) throws Exception {
        super(URI.create("string:///" + className.replace(‘.‘, ‘/‘)
                + Kind.SOURCE.extension), Kind.SOURCE);
        this.contents = contents;
    }
    public CharSequence getCharContent(boolean ignoreEncodingErrors)
            throws IOException {
        return contents;
    }
}
时间: 2024-10-13 12:35:20

Spring SpEL表达式的理解的相关文章

spring spel表达式语言

一.通过bean的id对bean进行引用 1.对其他bean的引用 <property name="dept" value="#{dept}"/> 等同于 <property name="dept" ref="dept"/> 2.对其他bean中某个属性的引用 <property name="deptName" value="#{dept.deptName}"

Spring讲解-----------表达式语言

5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式.存取对象图属性.对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义. 表达式语言给静态Java语言增加了动态功能. SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用. 5.1.2  能干什么 表达式语言

SpEL表达式

Spring3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值. SpEL特性: 1.使用bean的ID来引用bean 2.调用方法和访问对象的属性 3.对值进行算术.关系和逻辑运算 4.正则表达式匹配 5.集合操作 SpEL还可以用在依赖注入的其他地方,如Spring Security支持使用SqEL表达式定义安全规则.另外,如果你在S

Spring -- spEL&amp;Bean的生命周期&amp;工厂方法配置Bean

对于学习spring有帮助的网站:http://jinnianshilongnian.iteye.com/blog/1482071 Spring表达式语言:SpEL Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于 EL:SpEL 使用 #{-} 作为定界符,所有在大框号中的字符都将被认为是 SpEL SpEL 为 bean 的属性进行动态赋值提供了便利 通过 SpEL 可以实现: 1.通过 bean 的 id 对 bean 进行引用 2

SPEL 表达式解析

Spring Expression Language 解析器 SPEL解析过程 使用 ExpressionParser 基于 ParserContext 将字符串解析为 Expression, Expression 再根据 EvaluationContext 计算表达式的值. 将字符串解析为 Expression StandardBeanExpressionResolver# /** 默认表达式前缀 */ public static final String DEFAULT_EXPRESSION

Spring Security 表达式(Expressions) - hasRole示例

1.概述 Spring Security使用强大的Spring Expression Language(SpEL)提供各种各样的表达式.大多数这些Security表达式是针对上下文对象(当前经过身份验证的主体)进行工作的. 这些表达式的评估由SecurityExpressionRoot执行 - 它提供了Web安全性和方法级安全性的基础. Spring Security 3.0中引入了使用SpEL表达式作为授权机制的能力,并在Spring Security 4.x中继续使用,有关Spring Se

把功能强大的Spring EL表达式应用在.net平台

Spring EL 表达式是什么? Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用C#中提供的静态常量,获取外部json xml文件中的的配置值 为什么要使用SpringEL? 可以方便的注入 外部配置文件到 类的构造方法,属性或者 字段,支持注入容器里面的对象的某个属性值,还可以调用对象的方法,功能非常的强大,请看官方文档的例子或者下面我的单元测试例子 S

C#Lambda表达式的理解:谓词方法 匿名方法 使用Lambda

Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式.所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to".Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块. 下面三个方法会帮你会容易理解到Lambda表达式的好处,

Spring AOP 关键词的理解

1.如下图所示: AOP的执行就是在什么时候,什么地方,做什么. 2.关键词理解: 连接点(JoinPoint): 就是能够作为切点的一个个动作(方法),当然实际上不是所有连接点都当做切点的. 切点(Poincut):链接点中的一个或多个,切面会在这些点上来做文章(切点就是什么地方). 通知(Advice):通知是在切点上什么时候,做什么. 通知有下列几种类型:Before,After,After-returning, After-throwing,Around 切面(Aspect):切面包括切