一、Spring 全家桶简介
Spring 发展到现在,全家桶所包含的内容非常庞大,这里主要介绍其中关键的 5 个部分,分别是 spring framework、 springboot、 spring cloud、spring security、spring mvc。其中的 spring framework 就是大家常常提到的 spring, 这是所有 spring 内容最基本的底层架构,其包含 spring mvc、springboot、spring core、IOC 和 AOP 等等。Spring mvc 就是 spring 中的一个 MVC 框架,主要用来开发 web 应用和网络接口,但是其使用之前需要配置大量的 xml 文件,比较繁琐,所以出现 springboot,其内置 tomcat 并且内置默认的 XML 配置信息,从而方便了用户的使用。下图就直观表现了他们之间的关系。
而 spring security 主要是用来做鉴权,保证安全性的。Spring Cloud 基于 Spring Boot,简化了分布式系统的开发,集成了服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等各种服务治理能力。
整个 spring 家族有四个重要的基本概念,分别是 IOC、Context、Bean 和 AOP。其中 IOC 指控制反转,在 spring 中的体现就是将对象属性的创建权限回收,然后统一配置,实现解耦合,便于代码的维护。在实际使用过程中可以通过 autowired 注解,不是直接指定某个类,将对象的真实类型放置在 XML 文件中的 bean 中声明,具体例子如下:
<bean name="WelcomeService" class="XXX.XXX.XXX.service.impl.WelcomeServiceImpl"/>
Spring 将所有创建或者管理的对象称为 bean,并放在 context 上下文中统一管理。至于 AOP 就是对各个 MVC 架构的衔接层做统一处理,增强了代码的鲁棒性。下面这张图就形象描述了上述基本概念。
二、各子组件介绍
Spring 发展至今,整个体系不断壮大,子分类非常庞大,这里只对本次涉及的一些组件做简单的介绍。
首先是 Spring Websocket,Spring 内置简单消息代理。这个代理处理来自客户端的订阅请求,将它们存储在内存中,并将消息广播到具有匹配目标的连接客户端。Spring Data 是一个用于简化数据库访问,并支持云服务的开源框架,其主要目标是使数据库的访问变得方便快捷。Spring Data Commons 是 Spring Data 下所有子项目共享的基础框架,Spring Data 家族中的所有实现都是基于 Spring Data Commons。简单点说,Spring Data REST 把我们需要编写的大量 REST 模版接口做了自动化实现,并符合 HAL 的规范。Spring Web Flow 是 Spring MVC 的扩展,它支持开发基于流程的应用程序,可以将流程的定义和实现流程行为的类和视图分离开来。
三、使用量及使用分布
根据全网数据统计,使用 Spring 的网站多达 80 万余,其中大部分集中在美国,中国的使用量排在第二位。其中香港、北京、上海、广东四省市使用量最高。通过网络空间搜索引擎的数据统计和柱状图表,如下图所示。
四、漏洞背景介绍(SpEL 使用)
1、SpEL 是什么
SpEL 是基于 spring 的一个表达式语言,类似于 struts 的 OGNL,能够在运行时动态执行一些运算甚至一些指令,类似于 Java 的反射功能。就使用方法上来看,一共分为三类,分别是直接在注解中使用,在 XML 文件中使用和直接在代码块中使用。
2、SpEL 能做什么
● 基本表达式
包括逻辑运算,三目运算和正则表达式等等。
● 类操作表达式
对象方法调用,对象属性引用,自定义函数和类实例化等等。
● 集合操作表达式
字典的访问,投影和修改等等。
● 其他表达式
模板表达式
3、SpEL demo
基于注解的 SpEL
可以结合 sping 的 @Value 注解来使用,可以直接初始化 Bean 的属性值
在这种情况下可以直接将 test 的值初始化为 AAA。
此外,还有很多其他注解的使用方式,可以结合上面提到的表达式的四种使用模式。
基于 XML 的 SpEL
可以直接在 XML 文件中使用 SpEL 表达式如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="world" class="java.lang.String">
<constructor-arg value="#{' World!'}"/>
</bean>
<bean id="hello" class="java.lang.String"&