- 浏览: 21513995 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2420546
-
Spring杂谈
浏览量:3010267
-
跟开涛学SpringMVC...
浏览量:5640615
-
Servlet3.1规范翻...
浏览量:260233
-
springmvc杂谈
浏览量:1597956
-
hibernate杂谈
浏览量:250373
-
跟我学Shiro
浏览量:5860620
-
跟我学Nginx+Lua开...
浏览量:702889
-
亿级流量网站架构核心技术
浏览量:785761
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
5.4.1 xml风格的配置
SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是ApplicationContext,只有ApplicationContext实现默认支持SpEL,获取根对象属性其实是获取容器中的Bean。
首先看下配置方式(chapter5/el1.xml)吧:
java代码:
- <bean id="world" class="java.lang.String">
- <constructor-arg value="#{' World!'}"/>
- </bean>
- <bean id="hello1" class="java.lang.String">
- <constructor-arg value="#{'Hello'}#{world}"/>
- </bean>
- <bean id="hello2" class="java.lang.String">
- <constructor-arg value="#{'Hello' + world}"/>
- <!-- 不支持嵌套的 -->
- <!--<constructor-arg value="#{'Hello'#{world}}"/>-->
- </bean>
- <bean id="hello3" class="java.lang.String">
- <constructor-arg value="#{'Hello' + @world}"/>
- </bean>
模板默认以前缀“#{”开头,以后缀“}”结尾,且不允许嵌套,如“#{'Hello'#{world}}”错误,如“#{'Hello' + world}”中“world”默认解析为Bean。当然可以使用“@bean”引用了。
接下来测试一下吧:
java代码:
- @Test
- public void testXmlExpression() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter5/el1.xml");
- String hello1 = ctx.getBean("hello1", String.class);
- String hello2 = ctx.getBean("hello2", String.class);
- String hello3 = ctx.getBean("hello3", String.class);
- Assert.assertEquals("Hello World!", hello1);
- Assert.assertEquals("Hello World!", hello2);
- Assert.assertEquals("Hello World!", hello3);
- }
是不是很简单,除了XML配置方式,Spring还提供一种注解方式@Value,接着往下看吧。
5.4.2 注解风格的配置
基于注解风格的SpEL配置也非常简单,使用@Value注解来指定SpEL表达式,该注解可以放到字段、方法及方法参数上。
测试Bean类如下,使用@Value来指定SpEL表达式:
java代码:
首先看下配置文件(chapter5/el2.xml):
java代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <context:annotation-config/>
- <bean id="world" class="java.lang.String">
- <constructor-arg value="#{' World!'}"/>
- </bean>
- <bean id="helloBean1" class="cn.javass.spring.chapter5.SpELBean"/>
- <bean id="helloBean2" class="cn.javass.spring.chapter5.SpELBean">
- <property name="value" value="haha"/>
- </bean>
- </beans>
配置时必须使用“<context:annotation-config/>”来开启对注解的支持。
有了配置文件那开始测试吧:
java代码:
- @Test
- public void testAnnotationExpression() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter5/el2.xml");
- SpELBean helloBean1 = ctx.getBean("helloBean1", SpELBean.class);
- Assert.assertEquals("Hello World!", helloBean1.getValue());
- SpELBean helloBean2 = ctx.getBean("helloBean2", SpELBean.class);
- Assert.assertEquals("haha", helloBean2.getValue());
- }
其中“helloBean1 ”值是SpEL表达式的值,而“helloBean2”是通过setter注入的值,这说明setter注入将覆盖@Value的值。
5.4.3 在Bean定义中SpEL的问题
如果有同学问“#{我不是SpEL表达式}”不是SpEL表达式,而是公司内部的模板,想换个前缀和后缀该如何实现呢?
那我们来看下Spring如何在IoC容器内使用BeanExpressionResolver接口实现来求值SpEL表达式,那如果我们通过某种方式获取该接口实现,然后把前缀后缀修改了不就可以了。
此处我们使用BeanFactoryPostProcessor接口提供postProcessBeanFactory回调方法,它是在IoC容器创建好但还未进行任何Bean初始化时被ApplicationContext实现调用,因此在这个阶段把SpEL前缀及后缀修改掉是安全的,具体代码如下:
java代码:
- package cn.javass.spring.chapter5;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- import org.springframework.context.expression.StandardBeanExpressionResolver;
- public class SpELBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
- throws BeansException {
- StandardBeanExpressionResolver resolver = (StandardBeanExpressionResolver) beanFactory.getBeanExpressionResolver();
- resolver.setExpressionPrefix("%{");
- resolver.setExpressionSuffix("}");
- }
- }
首先通过 ConfigurableListableBeanFactory的getBeanExpressionResolver方法获取BeanExpressionResolver实现,其次强制类型转换为StandardBeanExpressionResolver,其为Spring默认实现,然后改掉前缀及后缀。
开始测试吧,首先准备配置文件(chapter5/el3.xml):
java代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <context:annotation-config/>
- <bean class="cn.javass.spring.chapter5.SpELBeanFactoryPostProcessor"/>
- <bean id="world" class="java.lang.String">
- <constructor-arg value="%{' World!'}"/>
- </bean>
- <bean id="helloBean1" class="cn.javass.spring.chapter5.SpELBean"/>
- <bean id="helloBean2" class="cn.javass.spring.chapter5.SpELBean">
- <property name="value" value="%{'Hello' + world}"/>
- </bean>
- </beans>
配置文件和注解风格的几乎一样,只有SpEL表达式前缀变为“%{”了,并且注册了“cn.javass.spring.chapter5.SpELBeanFactoryPostProcessor”Bean,用于修改前缀和后缀的。
写测试代码测试一下吧:
java代码:
- @Test
- public void testPrefixExpression() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter5/el3.xml");
- SpELBean helloBean1 = ctx.getBean("helloBean1", SpELBean.class);
- Assert.assertEquals("#{'Hello' + world}", helloBean1.getValue());
- SpELBean helloBean2 = ctx.getBean("helloBean2", SpELBean.class);
- Assert.assertEquals("Hello World!", helloBean2.getValue());
- }
此处helloBean1 中通过@Value注入的“#{'Hello' + world}”结果还是“#{'Hello' + world}”说明不对其进行SpEL表达式求值了,而helloBean2使用“%{'Hello' + world}”注入,得到正确的“"Hello World!”。
- <bean id="world" class="java.lang.String">
- <constructor-arg value="#{' World!'}"/>
- </bean>
- <bean id="hello1" class="java.lang.String">
- <constructor-arg value="#{'Hello'}#{world}"/>
- </bean>
- <bean id="hello2" class="java.lang.String">
- <constructor-arg value="#{'Hello' + world}"/>
- <!-- 不支持嵌套的 -->
- <!--<constructor-arg value="#{'Hello'#{world}}"/>-->
- </bean>
- <bean id="hello3" class="java.lang.String">
- <constructor-arg value="#{'Hello' + @world}"/>
- </bean>
- @Test
- public void testXmlExpression() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter5/el1.xml");
- String hello1 = ctx.getBean("hello1", String.class);
- String hello2 = ctx.getBean("hello2", String.class);
- String hello3 = ctx.getBean("hello3", String.class);
- Assert.assertEquals("Hello World!", hello1);
- Assert.assertEquals("Hello World!", hello2);
- Assert.assertEquals("Hello World!", hello3);
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <context:annotation-config/>
- <bean id="world" class="java.lang.String">
- <constructor-arg value="#{' World!'}"/>
- </bean>
- <bean id="helloBean1" class="cn.javass.spring.chapter5.SpELBean"/>
- <bean id="helloBean2" class="cn.javass.spring.chapter5.SpELBean">
- <property name="value" value="haha"/>
- </bean>
- </beans>
- @Test
- public void testAnnotationExpression() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter5/el2.xml");
- SpELBean helloBean1 = ctx.getBean("helloBean1", SpELBean.class);
- Assert.assertEquals("Hello World!", helloBean1.getValue());
- SpELBean helloBean2 = ctx.getBean("helloBean2", SpELBean.class);
- Assert.assertEquals("haha", helloBean2.getValue());
- }
- package cn.javass.spring.chapter5;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- import org.springframework.context.expression.StandardBeanExpressionResolver;
- public class SpELBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
- throws BeansException {
- StandardBeanExpressionResolver resolver = (StandardBeanExpressionResolver) beanFactory.getBeanExpressionResolver();
- resolver.setExpressionPrefix("%{");
- resolver.setExpressionSuffix("}");
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <context:annotation-config/>
- <bean class="cn.javass.spring.chapter5.SpELBeanFactoryPostProcessor"/>
- <bean id="world" class="java.lang.String">
- <constructor-arg value="%{' World!'}"/>
- </bean>
- <bean id="helloBean1" class="cn.javass.spring.chapter5.SpELBean"/>
- <bean id="helloBean2" class="cn.javass.spring.chapter5.SpELBean">
- <property name="value" value="%{'Hello' + world}"/>
- </bean>
- </beans>
- @Test
- public void testPrefixExpression() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter5/el3.xml");
- SpELBean helloBean1 = ctx.getBean("helloBean1", SpELBean.class);
- Assert.assertEquals("#{'Hello' + world}", helloBean1.getValue());
- SpELBean helloBean2 = ctx.getBean("helloBean2", SpELBean.class);
- Assert.assertEquals("Hello World!", helloBean2.getValue());
- }
评论
private String value;
例如上面表达式为:“#{‘12+10’}”、不是String、会提示类型转化错误、如何指定相对于的类型恩?
根据你的试了下 没有报错呀~~~
private String value;
例如上面表达式为:“#{‘12+10’}”、不是String、会提示类型转化错误、如何指定相对于的类型恩?
找到了这个帖子
发表评论
-
第十九章 动态URL权限控制——《跟我学Shiro》
2014-03-28 22:51 0用过Spring Security的朋友应该比较熟悉对URL ... -
第十九章 动态URL权限控制——《跟我学Shiro》
2014-03-28 22:51 0用过Spring Security的朋友应该比较熟悉对URL ... -
在应用层通过spring解决数据库读写分离
2012-11-09 07:28 3如何配置mysql数据库的主从? 单机配置mys ... -
跟我学spring3系列 word原版 下载
2012-11-03 20:39 122248《跟我学spring3系列》自发布以来得到大家的认可,非 ... -
跟我学spring3 电子书下载(完)
2012-05-03 14:23 52757感谢iteye各位网友对我的支持,在此谢过了! ... -
跟我学spring3 目录贴及电子书下载
2012-04-10 19:00 390639扫一扫,关注我的公众号 购买地址 ... -
【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3
2012-03-30 07:11 2753213.3 集成测试 13.3.1 ... -
【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3
2012-03-28 07:46 2364213.1 概述 13.1.1 测 ... -
【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3
2012-03-27 15:13 2082412.5 综合示例 12.5.1 概述 在第十一 ... -
【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
2012-03-26 08:26 2993312.4 基于Java类定义Bean配置元数据 12 ... -
【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
2012-03-26 08:00 56712.4 基于Java类定义Bean配置元数据 12 ... -
spring培训PPT(欢迎下载)
2012-03-24 21:55 45java私塾的 spring培训的PPT 欢迎大家下载。 包括 ... -
java私塾的spring培训PPT(欢迎下载)
2012-03-22 12:41 2973java私塾的 spring培训的PPT 欢迎大家下载。 ... -
【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3
2012-03-22 08:00 2669712.3 注解实现Bean定 ... -
【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3
2012-03-19 08:00 3318712.2 注解实现Bean依赖注入 12.2.1 ... -
【第十二章】零配置 之 12.1 概述 ——跟我学spring3
2012-03-19 07:59 2033112.1 概述 12.1.1 什 ... -
【第十一章】 SSH集成开发积分商城 之 11.3 实现积分商城层 ——跟我学spring3
2012-03-16 08:09 1809311.3 实现积分商城层 11.3.1 概述 ... -
【第十一章】 SSH集成开发积分商城 之 11.2 实现通用层 ——跟我学spring3
2012-03-14 08:08 1915411.2 实现通用层 11.2 ... -
【第十一章】 SSH集成开发积分商城 之 11.1 概述 ——跟我学spring3
2012-03-13 16:37 1944711.1 概述 11.1.1 功能概述 ... -
【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我学spring3
2012-03-13 08:46 12623先进行通用配置, 【第十章】集成其它Web框架 之 1 ...
相关推荐
### Spring 表达式语言 (SpEL) 中文参考手册概览 #### 一、Spring SpEL 概念与用途 Spring SpEL(Spring Expression Language)是一种强大的表达式语言,用于处理运行时查询和操作对象图。SpEL 的设计目标是提供一...
1.17 【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3 . . . . . . . . . . . . . . . .197 1.18 【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3 . . . . . . . . . . . . . . . . . . . ....
Spring 表达式语言(Spring Expression Language,简称 SpEL)是 Spring 框架中一个强大的表达式系统,用于在运行时查询和操作对象图。它允许动态访问和修改对象属性、执行方法、进行算术运算以及进行条件和逻辑判断...
Spring框架自3.0版本引入了一种全新的配置对象依赖注入的方式—Spring表达式语言(SpEL),这为开发人员提供了一个灵活且强大的工具,使得在配置文件或注解中进行复杂的逻辑处理成为可能。 #### 基础特性 ##### 定界...
在本文中,我们将深入探讨Spring 3.0.2 API文档中的核心组件,特别是Spring表达式语言(SpEL),它是Spring框架中的一个强大工具,用于在运行时查询和操作对象图。 Spring表达式语言(Spring Expression Language,...
标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
在Spring中,它通常被放置在类型上来定义Bean,而在参数或方法上使用表示依赖注入。 通过这些知识点的介绍,可以看出Spring 3在配置管理方面的进步和灵活性,使得开发者能够根据项目的需要和偏好来选择使用注解或...
【第五章】Spring表达式语言(SpEL)是一个强大的表达式语言,支持在运行时查询和操作对象图。5.1节概述SpEL,5.2节和5.3节详细说明SpEL的基础和语法,5.4节则展示了如何在Bean定义中使用SpEL。 【第六章】面向切面...
java *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取...
《跟我学Spring》这本书主要涵盖了Spring框架的核心概念和使用方法,包括IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及AOP(Aspect Oriented Programming,面向切面编程)、...
《跟我学Spring3》这本书是针对Spring框架进行深入解析的一本教程,涵盖了Spring的核心特性,包括IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、AOP(Aspect-Oriented Programming...
- **在Bean定义中使用EL:** 展示了如何在Spring配置中利用SpEL来配置bean的属性和构造参数。 ### 6. Spring对JDBC的支持 - **概述:** 介绍Spring对JDBC操作的支持,包括如何使用Spring提供的模板类来简化数据库...
在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...
4. **5.4 在Bean定义中使用EL**:演示了如何在Bean定义中使用SpEL来动态计算属性值或执行逻辑。 **第六章 AOP(Aspect-Oriented Programming)** AOP是Spring提供的一种编程范式,用于处理系统的横切关注点,如...
- **5.4 在Bean定义中使用EL**:展示了如何在Bean的定义中使用SpEL,实现动态配置和运行时计算。 6. **其他章节**: - **AspectJ切入点语法详解**:提供了关于AspectJ切点表达式的全面指南,帮助开发者精确地定义...
《跟我学Spring3》是针对初学者和有一定基础的开发者设计的一套全面、深入的教程,共计13个章节,涵盖了Spring3的核心概念和技术。Spring3作为Java开发中备受推崇的框架,它提供了丰富的功能,包括依赖注入、AOP...
2. **Spring与Quartz集成**:介绍如何在Spring应用中配置Quartz,包括使用`@EnableScheduling`注解开启调度,以及如何定义`@Scheduled`注解的任务。 3. **Cron表达式**:详细讲解Cron表达式的组成部分和语法,以及...
《跟我学Spring3》系列教程涵盖了Spring框架的核心概念和技术,包括IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、资源管理、Spring表达式语言(SpEL)以及面向切面编程(AOP)等...