当前位置: 首页 > news >正文

SSM三大框架的运行流程、原理、核心技术详解

一、Spring部分
1、Spring的运行流程
第一步:加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
,ApplicationContext接口,它由BeanFactory接口派生而来,因而提供了BeanFactory所有的功能。配置文件中的bean的信息是被加载在HashMap中的,一个bean通常包括,id,class,property等,bean的id对应HashMap中的key,value呢就是bean

具体如何加载?源码如下:

if (beanProperty.element("map") != null){
Map<String, Object> propertiesMap = new HashMap<String, Object>();
Element propertiesListMap = (Element)beanProperty.elements().get(0);
Iterator<?> propertiesIterator = propertiesListMap .elements().iterator();
while (propertiesIterator.hasNext()) {
Element vet = (Element) propertiesIterator.next();
if(vet.getName().equals("entry")) {
String key = vet.attributeValue("key");
Iterator<?> valuesIterator = vet.elements() .iterator();
while (valuesIterator.hasNext()) {
Element value = (Element) valuesIterator.next();
if (value.getName().equals("value")){
propertiesMap.put(key, value.getText());
}
if (value.getName().equals("ref")) {
propertiesMap.put(key, new String[]{
value.attributeValue("bean")
});
}
}
}
}
bean.getProperties().put(name, propertiesMap);
//看完反正我是默默放弃了。。。
}

//看完反正我是默默放弃了。。。

第二步:调用getBean方法,getBean是用来获取applicationContext.xml文件里bean的,()写的是bean的id。一般情况都会强转成我们对应的业务层(接口)。例如SpringService springService =(SpringService)ac.getBean("Service");

第三步:这样我们就可以调用业务层(接口实现)的方法。
具体如下:

Java反射博大精深,我也不很懂,具体请查看Java基础之—反射

那么bean中的东西到底是怎么注入进去的?简单来讲,就是在实例化一个bean时,实际上就实例化了类,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。这样就回到了我们Java最原始的地方,对象.方法,对象.属性

2、Spring的原理
什么是spring?
spring是一个容器框架,它可以接管web层,业务层,dao层,持久层的各个组件,并且可以配置各种bean, 并可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以直接getBean(id),使用即可
Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象) ,Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。

层次框架图:

说明:

web层: struts充当web层,接管jsp,action,表单,主要体现出mvc的数据输入,数据的处理,数据的显示分离
model层: model层在概念上可以理解为包含了业务层,dao层,持久层,需要注意的是,一个项目中,不一定每一个层次都有
持久层:体现oop,主要解决关系模型和对象模型之间的阻抗
3、Spring的核心技术
IOC
ioc(inverse of control)控制反转:所谓反转就是把创建对象(bean)和维护对象(bean)之间的关系的权利从程序转移到spring的容器(spring-config.xml)

说明:<bean></bean>这对标签元素的作用:当我们加载spring框架时,spring就会自动创建一个bean对象,并放入内存相当于我们常规的new一个对象,而<property></property>中的value则是实现了“对象.set方法”,这里也体现了注入了概念
DI

di(dependency injection)依赖注入:实际上di和ioc是同一个概念,spring的设计者,认为di更准确的表示spring的核心
spring提倡接口编程,在配合di技术就可以达到层与层解耦的目的,为什么呢?因为层与层之间的关联,由框架帮我们做了,这样代码之间的耦合度降低,代码的复用性提高
接口编程的好处请访问Java中接口编程的好处以及实现方式的选择?
AOP

aspect oriented programming(面向切面编程)
核心:在不增加代码的基础上,还增加新功能
理解:面向切面:其实是,把一些公共的“东西”拿出来,比如说,事务,安全,日志,这些方面,如果你用的到,你就引入。也就是说:当你需要在执行一个操作(方法)之前想做一些事情(比如,开启事务,记录日志等等),那你就用before,如果想在操作之后做点事情(比如,关闭一些连接等等),那你就用after。其他类似
二、Spring MVC部分
1、Spring MVC的运行流程
springMVC框架

框架执行流程(面试必问)
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
2、Spring MVC的原理
1、什么是SpringMVC?
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。

mvc
mvc在b/s系统 下的应用:

前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
处理器Handler (需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
视图View (需要程序员开发)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
struts2与springMVC的区别?

1、Struts2是类级别的拦截,一个类对应一个request 上下文, SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url ,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

2、由上边原因, SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码读程序时带来麻烦,每次来了请求就创建一个Action ,一个Action对象对应一个request 上下文。

3、由于Struts2需要针对每个request进行封装,把request , session等servlet生命周期的变量封装成一个一 个Map ,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。

4、拦截器实现机制上, Struts2有以自己的interceptor机制, SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

5、SpringMVC的入口是servlet ,而Struts2是filter (这里要指出, filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致 了二者的机制不同,这里就牵涉到servlet和filter的区别了。

6、SpringMVC集成了Ajax ,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax ,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

7、SpringMVC验证支持JSR303 ,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC-样的效果,但是需要xml配置的地方不少)。

9、设计思想上, Struts2更加符合0OP的编程思想,SpringMVC就比较谨慎,在servlet上扩展。

10、SpringMVC开发效率和性能高于Struts2。

11、SpringMVC可以认为已经100%零配置。

3、Spring MVC的核心技术
注解开发(@Controller,@RequestMapping,@ResponseBody。。。。)
还有Spring的诸多注解,这两者是不需要整合的~
传参,接参(request)
基本配置
文件上传与下载
Spring MVC中文件上传需要添加Apache Commons FileUpload相关的jar包,
基于该jar, Spring中提供了MultipartResolver实现类: CommonsMultipartResolver.
拦截器
其实最核心的还是SpringMVC的执行流程,各个点的作用得搞清楚。
三、Mybatis部分
1、Mybatis的运行流程
Mybatis运行流程图:

第一步:配置文件mybatis.xml,大体如下,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部文件
resource:引入项目中配置文件
url:引入网络中或者路径文件
-->
<properties resource="jdbc.properties"/>
<settings>
<!--<setting name="mapUnderscoreToCamelCase" value="true" />-->
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<package name="com.nuc.entity"></package>
</typeAliases>
<!-- - - - - - - 数据库环境配置- - - - - - - - - -->
<environments default="environments">
<environment id="environments">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- - - - - - - -映射文件路径- - - - - - -->
<mappers>
<!--自动扫描包下的映射文件,要求:同名,同目录-->
<package name="com.nuc.mapper" />
</mappers>
</configuration>

 


第二步:加载我们的xml文件
第三步:创建SqlSessionFactoryBuilder
第四步:创建SqlSessionFactory
第五步:调用openSession(),开启sqlSession
第六步:getMapper()来获取我们的mapper(接口),mapper对应的映射文件,在加载mybatis.xml时就会加载
第七步:使用我们自己的mapper和它对应的xml来完成我们和数据库交互。即增删改查。
第八步:提交session,关闭session。

代码如下:

String resource = "mybatis-config.xml";
SqlSession sqlSession = null;
InputStream inputStream = Resources.getResourceAsStream(resource);//读取mybatis配置文件
//SqlSessionFactoryBuilder这个类的作用就是为了创建SqlSessionFactory的
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
/**
* factory.openSession(); //需手动提交事务
* factory.openSession(true); //系统自动提交事务
*/
sqlSession = factory.openSession();
CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
//增删改查的操作
sqlSession.commit();//如果没有提交,数据库的数据不会改变
sqlSession.close();

 



需要注意的是,sqlSession也自带一些数据交互的操作

2、Mybatis的原理
什么是Mybatis?
mybatis专注sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,后来托管到github下:mybatis Github地址
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
mybatis底层实现
mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程
对原生态jdbc程序(单独使用jdbc开发)问题总结:

1、数据库连接,使用时创建,不使用就关闭,对数据库进行频繁连接开启和关闭,造成数据库资源的浪费

解决:使用数据库连接池管理数据库连接

2、将sql 语句硬编码到Java代码中,如果sql语句修改,需要对java代码重新编译,不利于系统维护

解决:将sql语句设置在xml配置文件中,即使sql变化,也无需重新编译

3、向preparedStatement中设置参数,对占位符位置和设置参数值,硬编码到Java文件中,不利于系统维护

解决:将sql语句及占位符,参数全部配置在xml文件中

4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。

解决:将查询的结果集,自动映射成java对象

mybatis工作原理
mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,获取sqlSession。SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。
3、Mybatis的核心技术
Mybatis输入映射

通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型
Mybatis输出映射

一、resultType

作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,则不会创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象

如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

二、resultMap

使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。
association:
作用:将关联查询信息映射到一个pojo对象中。
场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。
collection:
作用:将关联查询信息映射到一个list集合中。
场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。如果使用resultType无法将查询结果映射到list集合中。
Mybatis的动态sql

什么是动态sql?
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
包括, where ,if,foreach,choose,when,otherwise,set,trim等标签的使用
数据模型分析思路

1、每张表记录的数据内容
分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程
2、每张表重要的字段设置
非空字段、外键字段
3、数据库级别表与表之间的关系
外键关系
4、表与表之间的业务关系
在分析表与表之间的业务关系时一定要建立 在某个业务意义基础上去分析。

原文:https://blog.csdn.net/Song_JiangTao/article/details/82252852

转载于:https://www.cnblogs.com/h-c-g/p/10900439.html

相关文章:

  • 剑指offer——约瑟夫环
  • 爬虫的浏览器伪装技术
  • ChannelPipeline
  • 你需要的物流运输类报表,都在这里
  • 本地Navicat远程连接Centos7服务器出现的错误汇总
  • 转载一篇让你全面了解什么是.NET。
  • Java设计模式: 单例模式
  • webpack4.0介绍与使用(一)
  • Java 8中处理集合的优雅姿势——Stream
  • Linux上部署Springboot相关命令
  • ArrayList中的ConcurrentModificationException,并发修改异常,fail-fast机制。
  • vue-cli从2升级到3报错error 404 Not Found: @wry/context@^0.4.0
  • 创建数据结构库基础设施——异常类的构建
  • Windows下SVN的下载、安装
  • centOS7网络配置
  • 08.Android之View事件问题
  • 2017-08-04 前端日报
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • classpath对获取配置文件的影响
  • Create React App 使用
  • docker容器内的网络抓包
  • JavaScript服务器推送技术之 WebSocket
  • Java知识点总结(JavaIO-打印流)
  • JSONP原理
  • Netty源码解析1-Buffer
  • SpringCloud集成分布式事务LCN (一)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 设计模式走一遍---观察者模式
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 我的zsh配置, 2019最新方案
  • 小程序测试方案初探
  • zabbix3.2监控linux磁盘IO
  • 通过调用文摘列表API获取文摘
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $$$$GB2312-80区位编码表$$$$
  • $().each和$.each的区别
  • (a /b)*c的值
  • (C++20) consteval立即函数
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (二)hibernate配置管理
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (强烈推荐)移动端音视频从零到上手(下)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)创业的注意事项
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .“空心村”成因分析及解决对策122344
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET CLR Hosting 简介
  • .Net Memory Profiler的使用举例
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET开发人员必知的八个网站
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)