什么是框架
在编程领域,软件框架是指一种抽象形式,它提供了一个具有通用功能的软件,这些功能可以由使用者编写代码来有选择的进行更改,从而提供服务于特定应用的软件。软件框架提供了一种标准的方式来构建并部署应用。
Struts2框架介绍
直接上图
Struts2框架最主要的两个组件就是过滤器和拦截器,其中用到的思想就是上一章的反射和动态代理。
工作流程:
- 客户端浏览器发送HTTP请求到Web应用
- Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。
- 再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器
- StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理
- ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象
- ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result
- Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应
- HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端
struts2可以说是上一代的web框架,现在基本很少互联网会使用strust2,一来安全问题较多,二来现在有更方便的springboot框架,基本可以说被遗弃了。但是作为安全学习,我们还是有必要了解下基本的框架体系,如果想要深入的学习,可以网上自己搜索,作为曾经火遍大江南北的web框架,网上资料还是很多的。
Spring框架介绍
spring是一个一站式开发框架集,功能十分强大,就像一个大家族,有众多衍生产品,例如:springboot、springcloud、springsecurity等等。但他们都是基于spring的ioc和aop,ioc提供了依赖注入的容器,aop解决了面向切面的编程,然后在这两者的基础上实现了其他衍生产品的高级功能。
什么是IOC
控制反转(Inversion of Control)不是技术,是一种设计思想。所谓控制反转是指,本来被调用者的实例是由调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。
传统设计
ioc思想
什么是AOP
面向切面编程(Aspect Oriented Programming)它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成,提供了与 OOP 不同的抽象软件结构的视角来思考程序的结构,通过这种方式弥补面向对象编程(Object Oriented Programming)的不足。除了类以外,AOP提供了切面,切面对关注点进行模块化,例如横切多个类型和对象的事务管理(这些关注点术语通常称作横切(crosscutting)关注点)。Spring AOP是Spring的一个重要组件,但是Spring IOC并不依赖于Spring AOP,这意味着你可以自由选择是否使用AOP,AOP提供了强大的中间件解决方案,这使得Spring IOC更加完善。我们可以通过AOP来实现日志监听,事务管理,权限控制等等。
概念:
1 | 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。 |
2 | |
3 | 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring |
4 | AOP中,一个连接点总是表示一个方法的执行。 |
5 | |
6 | 通知(Advice):在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。 |
7 | |
8 | 切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。 |
9 | |
10 | 引入(Introduction):用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type |
11 | declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。 |
12 | |
13 | 目标对象(Target Object): 被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring |
14 | AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。 |
15 | |
16 | AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 |
17 | |
18 | 织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。 |
19 | |
20 | 通知类型: |
21 | |
22 | 前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。 |
23 | |
24 | 后置通知(After returning advice):在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 |
25 | |
26 | 异常通知(After throwing advice):在方法抛出异常退出时执行的通知。 |
27 | |
28 | 最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 |
29 | |
30 | 环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。 |
看完了上面的理论部分知识, 相信大家还是对AOP 的概念云里雾里的, 因为 AOP 中的概念是在是太多了, 我们也不必理解的那么透彻,直接从网上找个例子说明一下 AOP 中 Aspect,Joint point,Point cut 与 Advice之间的关系。
1 | 让我们来假设一下,从前有一个叫爪哇的小县城,在一个月黑风高的晚上,这个县城中发生了命案。 作案的凶手十分狡猾,现场没有留下什么有价值的线索。不过万幸的是,刚从隔壁回来的老王恰好在这时候无意中发现了凶手行凶的过程,但是由于天色已晚,加上凶手蒙着面,老王并没有看清凶手的面目,只知道凶手是个男性,身高约七尺五寸。 爪哇县的县令根据老王的描述,对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性,都要抓过来审问。 士兵当然不敢违背县令的命令,只好把进出城的所有符合条件的人都抓了起来。 |
2 | |
3 | 来让我们看一下上面的一个小故事和 AOP 到底有什么对应关系。 |
4 | |
5 | 首先我们知道,在 Spring AOP 中 Joint point 指代的是所有方法的执行点,而 point cut 是一个描述信息,它修饰的是 Joint point,通过 point cut,我们就可以确定哪些 Joint point 可以被织入 Advice。 对应到我们在上面举的例子,我们可以做一个简单的类比,Joint point 就相当于 爪哇的小县城里的百姓,pointcut 就相当于 老王所做的指控,即凶手是个男性,身高约七尺五寸,而 Advice 则是施加在符合老王所描述的嫌疑人的动作: 抓过来审问。 |
6 | 为什么可以这样类比呢? |
7 | |
8 | Joint point : 爪哇的小县城里的百姓: 因为根据定义,Joint point 是所有可能被织入 Advice 的候选的点,在 Spring AOP中,则可以认为所有方法执行点都是 Joint point。 而在我们上面的例子中,命案发生在小县城中,按理说在此县城中的所有人都有可能是嫌疑人。 |
9 | |
10 | Pointcut :男性,身高约七尺五寸: 我们知道,所有的方法(joint point) 都可以织入 Advice,但是我们并不希望在所有方法上都织入 Advice,而 Pointcut 的作用就是提供一组规则来匹配join point,给满足规则的 join point 添加 Advice。 同理,对于县令来说,他再昏庸,也知道不能把县城中的所有百姓都抓起来审问,而是根据凶手是个男性,身高约七尺五寸,把符合条件的人抓起来。 在这里 凶手是个男性,身高约七尺五寸 就是一个修饰谓语,它限定了凶手的范围,满足此修饰规则的百姓都是嫌疑人,都需要抓起来审问。 |
11 | |
12 | Advice :抓过来审问,Advice 是一个动作,即一段 Java 代码,这段 Java 代码是作用于 point cut 所限定的那些 Joint point 上的。 同理,对比到我们的例子中,抓过来审问 这个动作就是对作用于那些满足 男性,身高约七尺五寸 的爪哇的小县城里的百姓。 |
13 | |
14 | Aspect::Aspect 是 point cut 与 Advice 的组合,因此在这里我们就可以类比: “根据老王的线索,凡是发现有身高七尺五寸的男性,都要抓过来审问” 这一整个动作可以被认为是一个 Aspect。 |
说完AOP专业名词的概念,再来说下AOP具体的。相信大家对于OOP的理解不难,就以人(people)来说,我们就可以把它看做一类对象,people有身高、体重、年龄等属性,也有跑步、吃饭、睡觉、娱乐等行为,把这些属于people的属性和行为封装在people类中,然后以统一调用的方式(创建一个people类实例对象,通过这个对象实例来调用这些属性和行为)就叫做OOP思想。
OOP给我们的感觉就是结构清晰,高内聚,易维护等。这些属于一种从上到下的关系(即这个类封装的所有属性和方法都是属于people的),而我们的AOP思想就是一种从左到右的关系,以切入的方式将业务逻辑功能应用到每一层结构中(可以理解为类方法,类方法也是一种对象的行为实现)。
举个例子,people也可以分为少年、青年、中年、和老年,这几类人除了拥有自己的属性和行为外,生活中,或许还需要去医院看病,但是医院看病这一个逻辑业务功能并不是属于哪一类,而是谁生病了,才需要到医院看病,而基于面向对象编程的思想,我们是不可能把这一个业务逻辑行为加到每一个类中的,这不符合OOP思想,而这个就是AOP所做也可以做到事情了,AOP就是把医院看病这一个业务逻辑功能抽取出来,然后动态把这个功能注入到需要的方法(或行为)中,以后,不管是谁需要看病,就到医院这个第三方机构看病(AOP就是相当于把这个第三方机构独立出来),这样从业务逻辑角度上,AOP达到了更近一步的的解耦,所以我们也称AOP是对OOP的完善和增强。
而我们的编程中,常用到AOP的就是安全校验、日志操作、事务操作等,接下来一张图认识AOP思想:
AOP就是使用上图所示的“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”
SpringMVC框架
SpringMVC 是基于 Java 语言实现 MVC 设计模式的请求驱动类型的轻量级 Web 框架,目的是将 Web 开发模块化及代码简化。其提供了 DispatcherServlet 前端控制器分派请求,同时提供灵活的配置处理程序映射、视图解析,并支持文件上传。
MyBatis框架
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 的优点如下:
- 封装了 JDBC 大部分操作,减少开发人员工作量;
- 相比一些自动化的 ORM 框架,“半自动化”使得开发人员可以自由的编写 SQL 语句,灵活度更高;
- Java 代码与 SQL 语句分离,降低维护难度;
- 自动映射结果集,减少重复的编码工作;
- 开源社区十分活跃,文档齐全,学习成本不高。
SpringBoot框架
什么是SpringBoot
Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适)。
SpringBoot四个主要特性
SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;
自动配置:SpringBoot的自动配置特性利用了Spring4对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;
命令行接口:(Command-line-interface, CLI):SpringBoot的CLI发挥了Groovy编程语言的优势,并结合自动配置进一步简化Spring应用的开发;
Actuatir:它为SpringBoot应用的所有特性构建一个小型的应用程序。
简单来说,springboot也是属于spring框架中的一种,但是springboot”约定大于配置“的丽娘,极大简化了spring应用的初始搭建以及开发过程
框架比较
struts2 和 springMvc:
springmvc入口是一个servlet前端控制器(DispatcherServlet),struts2入口是一filter过滤器(StrutsPrepareAndExecuteFilter)。
struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action。springmvc通过在coontroller方法中定义形参接收参数,springmvc可以使用单例模式管理controller。
springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method)。struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法。开发中建议使用springmvc,springmvc方法更类似service业务方法。
struts2采用值栈存储请求和相应的数据,通过OGNL存取数据,springmvc通过参数绑定期将request请求内容解析,并给方法形参赋值。
struts2和springmvc的速度是相当的,由于struts2的漏洞较多,更多企业使用springmvc。
springMvc和springBoot:
- springMvc属于一个企业WEB开发的MVC框架,涵盖面包括前端视图开发、文件配置、后台接口逻辑开发等,XML、config等配置相对比较繁琐复杂。
- springBoot框架相对于springMvc框架来说,更专注于开发微服务后台接口,不开发前端视图。
参考:
https://mybatis.org/mybatis-3/zh/index.html
https://blog.csdn.net/qq_42494445/article/details/83926216
https://blog.csdn.net/qq_41701956/article/details/81215309
https://blog.csdn.net/wangzhidong_java/article/details/82974503