`
234390216
  • 浏览: 10237972 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462839
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775926
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398693
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395137
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680150
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531113
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1184890
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468698
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151478
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68321
社区版块
存档分类
最新评论

Spring(23)——SPEL表达式(四)

阅读更多

23.2.24 设置默认值

SpEl表达式中支持“a?:b”这样的语法来设置默认值。其表示如果a不为null时其结果为a,否则就为b。

@Test
public void test24 () {
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("#abc?:123").getValue().equals(123));//变量abc不存在
	Assert.assertTrue(parser.parseExpression("1?:123").getValue().equals(1));//数字1不为null
}

23.2.25 安全导航

我们可能经常会使用类似于“a.b.c”这样的用法,表示a的b属性的c属性,但如果a为null或者a的b属性为null时都会出现空指针。为了避免此种情况发生,我们可以在SpEl表达式中使用安全导航,这样当a为null或a的b属性为null时将直接返回null,而不抛出空指针异常。SpEl表达式中安全导航的语法是将点“.”替换为“?.”,即不使用“a.b.c”,而是使用“a?.b?.c”。

@Test
public void test25 () {
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertNull(parser.parseExpression("null?.abc").getValue());
	Assert.assertNull(parser.parseExpression("T(System)?.getProperty('abc')?.length()").getValue());//数字1不为null
}

23.2.26 获取bean对象

在SpEL表达式里面也可以直接访问bean对象,前提是指定了一个BeanResolver。BeanResolver是一个接口,其只定义了一个方法resolve,用以通过beanName解析为对应的bean对象并返回,具体定义如下。

public interface BeanResolver {

	Object resolve(EvaluationContext context, String beanName) throws AccessException;

}

如果要在SpEL表达式中访问bean对象,我们需要通过StandardEvaluationContext来设置对应的BeanResolver,同时我们需要在SpEL表达式中以“@beanName”的方式来访问对应的bean对象。如下是一段示例代码,我们在表达式中获取到了名称为hello的bean对象,并访问了其getKey()方法。

@Test
public void test26() {
	ExpressionParser parser = new SpelExpressionParser();
	StandardEvaluationContext context = new StandardEvaluationContext();
	context.setBeanResolver(new MyBeanResolver());
	//访问bean名称为hello的bean对象的getKey()方法。
	Object obj = parser.parseExpression("@hello.key").getValue(context);
	System.out.println(obj);
}

private static class MyBeanResolver implements BeanResolver {

	private static ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
	
	public Object resolve(EvaluationContext context, String beanName)
			throws AccessException {
		return appContext.getBean(beanName);
	}
	
}

23.3 SpelParserConfiguration

在构建SpelExpressionParser时我们可以给其传递一个SpelParserConfiguration对象以对SpelExpressionParser进行配置。其可以用于指定在遇到List或Array为null时是否自动new一个对应的实例,对应SpelParserConfiguration的第一个构造参数;也可以指定在List或Array中对应索引超出了当前索引的最大值时是否自动进行扩充,对应SpelParserConfiguration的第二个构造参数,更多信息请参考Spring的API文档。如下示例中我们就使用了SpelParserConfiguration对象,指定了在对应的List或Array为null时自动new一个对应的对象,并且在对应的索引超出了List或Array当前的最大索引时自动对其进行扩充。所以如下示例中在我们第一次访问User的interests时其为null,之后第二次访问时,由于指定了将自动new对应的对象并且在索引超出时自动进行扩充,所以将new一个List的实例,对应ArrayList,且在索引5不存在时将自动扩充并进行填值,填值时将对List的元素类型String new 6次。所以对于这种情况我们需要保证List或Array中存放的元素类型存在无参构造方法。

class User {
	public List<String> interests;
}

@Test
public void test() {
	User user = new User();
	SpelParserConfiguration parserConfig = new SpelParserConfiguration(true, true);
	ExpressionParser parser = new SpelExpressionParser(parserConfig);
	//第一次为null
	Assert.assertNull(parser.parseExpression("interests").getValue(user));
	//自动new一个List的实例,对应ArrayList,并自动new String()添加6次。
	Assert.assertTrue(parser.parseExpression("interests[5]").getValue(user).equals(""));
	//size为6
	Assert.assertTrue(parser.parseExpression("interests.size()").getValue(user).equals(6));
}

23.4 在bean定义中使用SpEl

在bean定义中使用SpEl表达式的语法是“#{exp}”。exp就是对应的表达式。如下示例中我们定义了一个名为hello的bean,在指定其userDir时我们使用了表达式。

<bean id="hello" class="com.app.Hello">
	<property name="userDir" value="#{T(System).getProperty('user.dir')}"/>
</bean>

对于系统属性而言,在bean定义中使用时有一个内置的变量可以使用叫systemProperties,而且在使用时不需要加“#”,即不需要以“#systemProperties”的形式出现。所以上述示例也可以是如下这样。

<bean id="hello" class="com.elim.learn.spring.bean.Hello">
	<property name="userDir" value="#{systemProperties['user.dir']}"/>
</bean>

23.4.1 引用其它bean的属性

在进行bean定义时,我们也可以通过表达式引用其它bean定义的属性。如下示例中我们就在定义id为world的bean的key属性时通过表达式引用了名为hello的bean的key属性,即world的key属性也将被赋予值“abc”。

<bean id="hello" class="com.app.Hello">
	<property name="key" value="abc"/>
</bean>

<bean id="world" class="com.app.World">
	<property name="key" value="#{hello.key}"/>
</bean>

23.4.2 基于注解配置的使用

在基于注解配置的bean定义中我们也可以使用SpEl表达式进行某些定义。在基于注解配置bean定义时我们可以使用@Value注解定义在方法或属性上来指定对应的值。此时我们就可以使用对应的表达式,当然不使用表达式也是可以的。如下示例中我们就通过@Value指定了userDir和key的值。其中userDir的值的定义使用了SpEl表达式,而key的值的定义是直接定义的。

public class Hello {

	@Value("#{systemProperties['user.dir']}")
	private String userDir;
	@Value("abc")
	private String key;

	public String getUserDir() {
		return userDir;
	}

	public void setUserDir(String userDir) {
		this.userDir = userDir;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

}

(注:本文是基于Spring4.1.0所写)

0
1
分享到:
评论

相关推荐

    Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现

    漏洞的根源在于Spring Cloud Gateway Actuator API 对用户输入的参数没有进行充分的验证和过滤,这使得攻击者可以通过构造恶意的SpEL表达式来执行任意系统命令。例如,当Actuator的某个端点接受到包含SpEL表达式的...

    Spring Boot配置Thymeleaf(gradle)的简单使用

    Spring Boot 配置 Thymeleaf 的简单使用 在本文中,我们将讨论如何在 Spring Boot 项目中配置 Thymeleaf,以便于使用 HTML 视图模板。Thymeleaf 是一个流行的模板引擎,可以帮助我们快速开发 Web 应用程序。在以下...

    spring3.0_doc_api

    4. **基于表达式的SpEL(Spring Expression Language)**:提供了强大的表达式语言,用于在运行时查询和操作对象图。 5. **RESTful Web服务支持**:Spring MVC模块增加了对RESTful服务的支持,通过`@RequestMapping...

    spring学习笔记(四)

    这里的`#{systemProperties['java.version']}`就是一个SpEL表达式,它会获取系统属性`java.version`的值。 除了`@Value`,Spring还提供了其他许多工具和注解,如`@Autowired`用于自动装配Bean,`@Component`、`@...

    跟开涛学Spring

    1.15 【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3 . . . . . . . . . . . . . . .177 1.16 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3 . . . . . . . . . . . . ....

    Spring3.0_MVC_中文教程

    同时,Spring3.0引入了一种新的表达式语言——Spring 表达式语言(SpEL),它允许在XML和注解中定义基于bean的定义。此外,Spring3.0还支持REST Web服务和注解的格式化,例如,可以使用@DateTimeFormat和@...

    spring security 2.0 的简单配置使用(补)——用aop控制method级权限

    `@PreAuthorize`允许使用SpEL(Spring Expression Language)表达式进行更复杂的权限检查。 5. **自定义访问决策策略** 默认的访问决策管理器可能不满足所有需求,我们可以创建自定义的访问决策策略。例如,可以...

    spring 3.x 第四章例子

    7. **SpEL(Spring Expression Language)**:Spring表达式语言提供了一种强大的方式来在运行时查询和操作对象图。SpEL可以在注解中使用,例如在@Value注解中引用属性值,或者在AOP切点表达式中使用。 8. **AOP代理**...

    最新版spring-framework-4.3.10.RELEASE-dist完整包

    12. **Spring Expression Language (SpEL)**:SpEL是Spring的表达式语言,用于在运行时查询和操作对象图。 13. **事件驱动架构**:Spring支持事件驱动编程模型,允许组件之间通过发布和监听事件进行通信。 14. **...

    spring 1到3大版本号下的最高版本

    2.5.6引入了Spring Expression Language (SpEL),这是一个强大的表达式语言,用于在运行时查询和操作对象图。此外,它还引入了基于注解的配置,使得开发者可以使用注解替代XML配置文件,大大简化了项目设置。这个...

    spring aop依赖jar包

    - `spring-expression.jar`(可能需要):Spring表达式语言(SpEL),用于在运行时查询和操作对象图。 在使用这些jar包时,你需要确保它们都在你的项目类路径(ClassPath)下。如果你使用Maven或Gradle等构建工具,...

    spring4.1.5、4.3.15、4.3.24版本使用的jar包

    同时,Spring 4.1还引入了Spring Expression Language (SpEL)的增强,允许更灵活的表达式计算。 2. **Spring 4.3.x系列**:这个版本系列是对4.1的重大升级,4.3.15和4.3.24是其中的稳定版本。Spring 4.3引入了更多...

    spring-2.5.6.jar

    8. **Spring表达式语言(SpEL)**:Spring Expression Language是Spring框架内的一种强大表达式语言,用于在运行时查询和操纵对象图。它可以用于Bean装配、AOP等方面,提供灵活的数据绑定和表达式计算。 9. **...

    spring-3.1.0中文版api帮助文档.pdf

    #### 四、Spring表达式语言(SpEL)的引入 Spring 3.1新增了Spring表达式语言(SpEL),这是一种强大的领域特定语言,用于在运行时查询和操纵对象图。SpEL支持丰富的操作符和函数,可以用于属性访问、算术运算、条件...

    spring-framework-reference 3.0

    Spring 3.0 中引入了一个新的表达式语言——**Spring Expression Language (SpEL)**。这是一种强大的脚本语言,用于在Spring组件之间描述任务和配置。SpEL可以更好地与XML配置文件交互,并且对于安全性和集成方面...

    跟我学spring

    【第五章】Spring表达式语言(SpEL)是一个强大的表达式语言,支持在运行时查询和操作对象图。5.1节概述SpEL,5.2节和5.3节详细说明SpEL的基础和语法,5.4节则展示了如何在Bean定义中使用SpEL。 【第六章】面向切面...

    spring4.2的lib包

    5. **更强大的SpEL(Spring Expression Language)**:Spring的表达式语言在4.2版本中也有所增强,提供了更多函数和操作符,使得在运行时动态评估表达式更为强大。 综上所述,`spring4.2.jar`是Spring框架4.2版本的...

    spring框架:spring-framework-4.3.9.RELEASE-dist

    5. **Spring Expression Language (SpEL)**:一种强大的表达式语言,用于在运行时查询和操作对象图。 四、实践应用 在实际项目中,开发者可以利用Spring框架4.3.9.RELEASE来构建模块化的应用,通过DI管理组件之间的...

Global site tag (gtag.js) - Google Analytics