Spring生态
Spring开源框架由Rod Johnson创建,从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。时至今日Spring已经不再是一个简单的编程框架了,在整个Spring生态中包含了许多应用在特定场景的具体框架,如”Spring Framework”,”Spring Security”,“Srping Boot”,”Spring Cloud“等等。其中Spring Framework框架是整个生态的核心基础,每个框架都有自己独立的代码仓库。
Spring生态系统提供许多有用的编程框架或工具集,当下最为流行的Spirng项目:Spring Framework,Spring Security,Spring Boot,Spring Cloud等。
- Spring Framework
SpringFramework项目是整个Spring生态的基础,Spring Framework项目又包含多个子模块,如:spring-core,spring-beans,spring-context,spring-aop,spring web,spring-webmvc等等。
- Spring Boot
Spring Boot是一个开发基于Spring Framework的项目,它默认继承了嵌入式的Tomcat,配置注解化,支持快速集成第三方开发组件(如Mybatis),大大降低了使用Spring的门槛,而且内置了许多可以直接用于生产环境的功能,是目前用于开发微服务架构项目的不二选择。
- Spring Cloud
Spring Cloud为开发基于微服务架构的软件系统提供了一整套工具集合,其中包含了开发各个微服务组件的具体项目,如:Spring Cloud Conifg,Spring Cloud Netflix , Spring Cloud Sletuth , Spring Cloud Gateway等等。Spring Cloud的基础是Spring Boot,基于Spring Boot可以大大简化开发各微服务组件的流程。
- Spring Security
Spring Security是用于实现认证和授权,以及访问控制的安全框架,在java生态与之提供类似的功能还有一个框架:Apache Shiro.Spring Security依赖于Spring Framework,也就是说如果要使用Spring Security,那么应用架构也必须是基于Spring Framework的。这大大限制了Spring Security的使用场景;反之,Shiro就没有这样限制,而且从项目架构上Shiro更加间接。Spring Security提供了非常丰富的安全控制的功能,在某些方面甚至比Shiro更加完善,与之对应的是掌握Spring Security的复杂度比较大。因此,对于在应用中是否选择Spring Security需要根据实际需求来决定。
Spel表达式
在Spring3中引入了Spring表达式语言,支持在运行时查询和操作对象图,可以与基于XML和基于注解的Spring配置还有bean定义一起使用,表达式语言给静态Java语言增加了动态功能。Spel是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用,因为Spel是以API接口的形式创建的,所以允许将其集成到其他应用程序和框架中。
1 | <dependency> |
变量
变量通过EvaluationContext接口的setVariable(variableName,value)方法定义,在表达式使用#variableName引用,除了引用自定义变量,Spel还允许引用根对象及当前上下文对象,使用#root引用根对象,使用#this引用当前上下文对象。
1 | ExpressionParser parser = new SpelExpressionParser(); |
类型表达式
在Spel表达式中,使用T(Type)运算符会调用类的作用域和方法。换句话说,就是可以通过该类类型表达式来操作类。使用T(Type)来表示java.lang.Class实例,Type必须是类全限定名,”java,lang”包除外,因为Spel已经内置了该包,即该包下的类可以不指定具体的报名,使用类类型表达式还可以进行访问静态方法和类静态字段。
例如,在XML配置文件中的使用示例,要调用java.lang.Math来获取0-1的的随机数
1 | <property name="random" value="#{T(java.lang.Math).random()}"/> |
例1:Expression表达式引用:
1 | public class Demo { |
例2:基于xml实现表达式求值,表达式使用T(Type)运算符
实体类:
1 | public class HelloWorld { |
Spel.xml
1 |
|
测试方法:
1 | ApplicationContext context = new |
例3:表达式使用T(Type)运算符调用执行代码的操作类
1 |
|
测试方法:
1 | ApplicationContext context = new |
Spel表达式用法
- 基于注解
- xml配置
- 代码块中使用Expression
定界符
Spel使用#{}作为定界符,所以在大括号中的字符都将被认为是Spel表达式,在其中可以使用Spel运算符,变量,引用bean及其属性和方法等。
- #{}是Spel的定界符,用于指明Spel表达式并执行;${}主要用于加载外部属性文件中的值。
- #{} 和 ${} 可以混合使⽤,但是必须 #{} 在外⾯,${} 在⾥⾯,如 #{’${}’},注意单引号是字 符串类型 才添加的。
基于注解Annotation
@Value注解可以放在字段、方法和方法/构造参数里,以指定默认值。
例如:修饰成员变量,Spring容器会根据SpEL表达式语法筛选修改数据,然后赋值给@Value修 饰的变 量。
1 |
|
比如可以:
1 | package anno; |
配置类Myconfig
1 | package anno; |
测试代码
1 | AnnotationConfigApplicationContext applicationContext = new |
结果是空的,没有赋值。
可以直接在配置文件中进行属性赋值,调用有参构造函数
配置类文件myconfig
1 |
|
这样输出的值就会产生赋值。
基于xml配置实现
student实体类
1 | package xml; |
spel.xml
1 |
|
测试代码
1 | public class Demo2 { |
代码块中使用Expression
- ExpressionParser:表示解析器,默认实现是org.springframework.expression.spel.standard包中的SpelExpressionParser 类,使用parseExpression方法将字符串表达式转换为Expression对象,对于parseContext接口,用于定义字符串表达式是不是模板,及模板开始与结束字符。
- EvaluationContext:表示上下文环境,默认实现是 org.springframework.expression.spel.support 包中的 StandardEvaluationContext 类,使用setRootObject方法来设置根对象,使用setVariable ⽅法来注册⾃定义变量,使⽤ registerFunction 来注册⾃定义函数等等。
- Expression:表示表达式对象,默认实现是org.springframework.expression.spel.standard 包中的 SpelExpression,提供getValue方法用于获取表达式值,提供setValue方法用于设置对象值。
例如:
1 | public static void test1(){ |
SpEl表达式注入
EvaluationContext 表示上下⽂环境,系统提供了2个EvaluationContext接⼝实现类
- SimpleEvaluationContext:仅支持Spel语言语法的一个子集,不包括java类型引用,构造函数和bean引用。
- StandardEvaluationContext:支持全部Spel语法,在不指定EvaluationContext的情况下默认采用的是StandardEvaluationContext。
SpEl表达式是可以操作类及其方法的,可以通过类型表达式T(Type)来调用任意类方法。在不指定EvaluationContext的情况下默认采用的是StandardEvaluationContext,而它包含了SPEL的所有功能,允许用户在可以控制输入的情况下成功造成任意代码执行。
例如:
1 | public static void test1(){ |