发表于: 2017-08-28 21:33:07
1 870
一、今日完成
1.周日临时有事,没有学习Spring表达式语言,落下了一天的任务。
2.学习SqEL
1)概念学习。SqEL是一种表达式语言,提供一组扩展功能,,从而可以与一个基于Spring的应用程序中的运行时对象交互;可以在XML配置和编程的Java代码中使用SqEL。
2)使用SqEL配置应用程序(基于XML的配置)
i.使用IDEA新建一个maven web项目,向pom.xml中添加spring-expression、spring-core、spring-context,添加<properties>元素统一配置spring版本:
<spring.version>4.2.10.RELEASE</spring.version>
ii.在src/main/resource目录下,新建上下文配置文件applicationContext.xml,在<Beans>元素中创建名为MyBean的<Bean>,使用一个表达式(包含在#{…}中)设置该Bean的message字段,获取系统属性user.language。
<bean id="show1" class="com.wiley.beginningspring.ch9.MyBean">
<property name="message" value="#{systemProperties['user.language']}" />
</bean>
iii.在src/main/java/com.wiley.beginningspring.ch9目录下创建一个MyBean类,定义setter和getter方法
package com.wiley.beginningspring.ch9;
public class MyBean {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
iv.在src/main/java/com.wiley.beginningspring.ch9目录下创建一个Main类
package com.wiley.beginningspring.ch9;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String... args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean(MyBean.class);
System.out.println(myBean.getMessage());
}
}
3)使用SqEL配置应用程序(基于注解的配置)
i.使用IDEA新建一个maven web项目,引入和上面相同的依赖项
ii.在src/main/java/com.wiley.beginningspring.ch9目录下创建一个ApplicationConfig类、MyBean类
package com.wiley.beginningspring.ch9;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"com.wiley.beginningspring.ch9"})
public class ApplicationConfig {
}
package com.wiley.beginningspring.ch9;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
@Value("#{systemProperties['user.language']}")
private String message;
public String getMessage() {
return message;
}}
使用@Component注解将MyBean定义为一个Spring Bean,在message字段上使用@Value注解,当实例化Bean时,将使用注解设置默认值,使用#{systemProperties['user.language']}表达式来设置该值。
4)为应用程序上下文编写XML代码时,有#{…}和${…}两种语法。其中,使用${…}定义属性占位符,就像从一个属性文件中读取值,并使用已经定义的值替换匹配项;使用#{…}所定义的Spring表达式将被动态评估。
SqEL上下文定义的每一个表达式一般先被解析然后被评估。而解析的过程,先创建一个实现了ExpressionParser接口的分析器,然后调用ExpressionParser接口提供的pareseExpression方法去解析表达式。被解析的表达式被视为一个表达式模板,用来定义评价块。当文本前缀和后缀分割后,评估块就确定了。在SqEL中,默认前缀为'#'后缀为'}'。如果没有前后缀,表达式字符串将被视为文本(这仅针对XML配置有效,编程解析不需要前后缀)。
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parserExpression("'Hello World'');
5)学习SqEL调用Spring Bean方法
i.使用IDEA新建一个maven web项目,添加spring依赖项;
ii.在src/main/resource目录下,新建上下文配置文件applicationContext.xml,
<bean id="show1" class="com.wiley.beginningspring.ch9.Show">
<property name="instrument" value="Piano" />
<property name="song" value="Turning Tables" />
</bean>
<bean id="show2" class="com.wiley.beginningspring.ch9.Show">
<property name="instrument" value="Guitar" />
<property name="song" value="#{show2.guitarSong()}" />
</bean>
iii.src/main/java/com.wiley.beginningspring.ch9目录下新建Show类
package com.wiley.beginningspring.ch9;
public class Show {
private String instrument;
private String song;
public void setInstrument(String instrument) {
this.instrument = instrument;
}
public void setSong(String song) {
this.song = song;
}
public String guitarSong() {
return "More Than Words";
}
public void present() {
System.out.println("Playing " + song + " with instrument " + instrument);
}
}
再新建Main类
package com.wiley.beginningspring.ch9;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String... args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Show show1 = (Show) context.getBean("show1");
show1.present();
Show show2 = (Show) context.getBean("show2");
show2.present();
}
}
在Main类中,首先创建应用程序上下文,访问Bean,然后调用presen()方法。
iv.在src/test目录下,新建测试类,在字符串上调用方法
public class MethodInvocationStringConcatTest {
ExpressionParser parser;
@Before
public void setup() {
parser = new SpelExpressionParser();
}
@Test
public void helloParsedAndConcatenatedWithWorld() {
Expression exp = parser.parseExpression("'Hello'.concat(' World!')");
String value = exp.getValue(String.class);
assertThat(value, is("Hello World!"));
}
}
将两个字符串代码连接起来,然后确定结果与字符串结果Hello World!相匹配。
v.在表达式中,通过调用对象的构造函数并提供参数来创建对象
Expression exp = parser.parseExpression(" new Double (3.1415926)");
6)学习SqEL基本运算符和用法。
二、明日计划
1.复习Spring MVC的基本实现流程,写一个小程序块;
2.学习mybatis基本用法
三.遇到的问题
1)现在每天花了不少精力时间在spring框架的基础知识上,但是每天可以记住并能够使用的知识点不多,现在先走马观花了解这些,只要还是紧跟任务的技能需求,以后遇到了相关知识点可以快速反应过来能够去查找学习起来。
2)虽然这几天学习了Spring IoC容器的创建和使用、依赖注入,但是还有比较生疏,计划每天还是需要抽一点时间时常去温习。
四、收获
如上,学习SqEL。
评论