ssm框架原理及流程图,ssm框架实现原理,SSM框架流程及原理分析

ssm框架原理及流程图,ssm框架实现原理,SSM框架流程及原理分析

本文给大家分享小编一些心得体会,主要是学习地对地导弹(地对地导弹)框架之后的收获吧,重点给大家介绍地对地导弹(地对地导弹)框架流程以及原理分析,通过图文实例相结合给大家介绍的非常详细,需要的朋友参考下吧

前言:学地对地导弹框架已经有很长时间,今天来复习一下

地对地导弹(地对地导弹)图示流程:

春天核心:Java反射

Mybatis:动态代理,而动态代理又是基于反射的,所以,ssm框架核心原理在反射。

(1)Spring(对象工厂):平时开发接触最多的估计就是这个国际奥林匹克委员会容器,它可以装载豆子(也就是Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)中的类,当然也包括服务、道里面的),有了这个机制,就不用在每次使用这个类的时候为它初始化,很少看到关键字新的。

(2)SpringMVC(视图控制器):核心为一个调度员服务网,控制所有请求

这里奉上手写SpringMVC的核心调度员服务网源码

打包小型应用程序

导入Java。io。文件;

导入Java。io。io异常;

导入Java。io。inputstream

导入Java。郎。反思。方法;

导入Java。网。网址;

导入Java。util。ArrayList

导入Java。util。数组;

导入Java。util。hashmap

导入Java。util。列表;

导入Java。util。地图;

导入Java。util。地图。词条;

导入Java。util。属性;

导入javax。servlet。servlet配置;

导入javax。servlet。servlet异常;

导入javax。servlet。http。http servlet

导入javax。servlet。http。http servlet请求;

导入javax。servlet。http。http servlet响应;

导入注释HController

导入注释HRequestMapping。

/**

* 手写SpringMVC

*

* @作者hxz

* @description TODO

* @data 2020年一月2日上午9:39:57

*/

公共类MyDispatcherServlet扩展HttpServlet {

//加载属性文件

私有属性Properties=new Properties();

//装载beanname

private ListString类名=new ArrayList string();

//国际奥委会容器

private MapString,Object ioc=new HashMapString,Object();

//类似于以前自定义的隐藏物缓存容器,这里也是起到一个容器的作用

//用于加载各个绘图

private MapString,方法处理程序mapping=new hashmap string,Method();

//容器加载所有的控制器

private MapString,Object controller map=new hashmap string,Object();

@覆盖

公共void init(ServletConfig配置)引发ServletException {

//1.加载配置文件

doLoadConfig(配置。getinitparameter(' contextConfigLocation '));

//2.初始化所有相关联的类,扫描用户设定的包下面所有的类

做扫描仪(属性。getproperty('扫描包');

//3.拿到扫描到的类,通过反射机制,实例化,并且放到国际奥委会容器中beanName默认是首字母小写

do instance();

//4.初始化句柄映射(将全球资源定位器(统一资源定位器)和方法对应上)

initHandlerMapping();

}

@覆盖

受保护的void doGet(http servlet请求req,HttpServletResponse resp)抛出ServletException,IOException {

this.doPost(req,resp);

}

@覆盖

受保护的void doPost(http servlet请求req,HttpServletResponse resp)抛出ServletException,IOException {

尝试{

//处理请求

doDispatch(req,resp);

} catch(异常e) {

resp.getWriter().写(' 500!服务器异常');

}

}

私有void do分派(http servlet请求请求,http servlet响应响应)引发异常{

if (handlerMapping.isEmpty()) {

返回;

}

字符串URL=req。getrequesturi();

字符串上下文路径=req。get context path();

url=url.replace(contextPath,' ').replaceAll('/','/');

如果(!这个。处理器映射。包含密钥(URL)){

resp.getWriter().写(' 404未找到!');

返回;

}

方法方法=这个。处理器映射。get(网址);

//获取方法的参数列表

班级?[]参数类型=方法。getparameter types();

//获取请求的参数

MapString,String[]参数map=req。getparametermap();

//保存参数值

Object[]param values=新对象[参数类型。长度];

//方法的参数列表

for(int I=0;我参数类型。长度;i ) {

//根据参数名称,做某些处理

string request param=参数类型[I].get simplename();

if(请求参数。等于(' http servlet请求'){

//参数类型已明确,这边强转类型

param values[I]=req;

继续;

}

if(请求参数。等于(' http servlet响应'){

参数值[I]=resp;

继续;

}

if(请求参数。等于(' String '){

for (EntryString,String[]param:参数映射。条目集()){

字符串值=数组。tostring(param。getvalue()).replaceAll('\\[|\\]',' ').replaceAll(',\\s ',',');

paramValues[i]=值;

}

}

}

//利用反射机制来调用

尝试{

方法。调用(这个。控制器图。get(URL),param值);//第一个参数是方法所对应的实例

//在国际奥委会容器中

} catch(异常e) {

e。printstacktrace();

}

}

私有void doLoadConfig(字符串位置){

//把web.xml中的contextConfigLocation对应价值值的文件加载到流里面

InputStream资源asstream=this。获取类().getClassLoader().getResourceAsStream(位置);

尝试{

//用性能文件加载文件里的内容

属性。load(resourceAsStream);

} catch (IOException e) {

e。printstacktrace();

}最后{

//关流

if (null!=resourceAsStream) {

尝试{

资源流。close();

} catch (IOException e) {

e。printstacktrace();

}

}

}

}

私有void do扫描仪(字符串包名){

//把所有的。替换成/

URL url=this.getClass().getClassLoader().获取资源('/'包名。全部替换(' \ \ . '), '/'));

文件目录=新文件(网址。getfile());

for (File file : dir.listFiles()) {

if (file.isDirectory()) {

//递归读取包

doScanner(packageName ' . '文件。getname());

}否则{

String className=packageName ' . 'file.getName().替换('。类',' ');

类名。add(类名);

}

}

}

//利用Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)的反射机制

私有void doInstance() {

if (classNames.isEmpty()) {

返回;

}

对于(字符串类名:类名){

尝试{

//把类搞出来,反射来实例化

班级?clazz=Class.forName(类名);

如果(clazz。isanationpresent(h控制器。class)){

国际奥委会。把(toLowerFirstWord(clazz。get simplename()),clazz。new instance());

}否则{

继续;

}

} catch(异常e) {

e。printstacktrace();

继续;

}

}

}

私有void initHandlerMapping() {

if (ioc.isEmpty()) {

返回;

}

尝试{

for (EntryString,Object entry : ioc.entrySet()) {

班级?扩展对象clazz=entry.getValue().getClass();

如果(!克拉兹。isanationpresent(h控制器。class)){

继续;

}

//拼全球资源定位器(统一资源定位器)时,是控制器头的全球资源定位器(统一资源定位器)拼上方法上的全球资源定位器(统一资源定位器)

字符串基URL=

如果(clazz。isanationpresent(hrequestmapping。class)){

HRequestMapping批注=clazz。获取批注(HRequestMapping。类);

基本URL=注释。value();

}

method[]methods=clazz。get方法();

对于(方法方法:方法){

如果(!方法。isanationpresent(hrequestmapping。class)){

继续;

}

HRequestMapping批注=方法。获取批注(HRequestMapping。类);

字符串URL=注释。value();

url=(baseUrl '/' url).replaceAll('/','/');

handlerMapping.put(url,方法);

controllerMap.put(url,clazz。new instance());

System.out.println(url ','方法);

}

}

} catch(异常e) {

e。printstacktrace();

}

}

/**

* 把字符串的首字母小写

*

* @param name

* @返回

*/

私有字符串toLowerFirstWord(字符串名称){

char[]char array=name。tochararray();

charArray[0]=32;

返回字符串。(charArray)的值;

}

}

从源码及可看出流程:

1)客户端发送请求到DispacherServlet(由web.xml拦截所有请求到改servlet);

2)由DispacherServlet(核心servlet)控制器查询HanderMapping,找到处理请求的控制器;(这里我用了一个地图类似于缓存容器,装载所有的绘图即映射)

3)控制器层调用业务逻辑处理后,返回ModelAndView,即下一层(往往是服务、服务实现、映射器层)返回的的数据;

4)调度员serclet查询视图解析器,找到ModelAndView指定的视图;

5)视图负责将结果显示到客户端。

(3)Mybatis(持久层框架):mybatis是jdbc的封装,使得数据库底层操作透明化。mybatis的操作都是围绕一个sqlSessionFactory的实例。Mybatis通过配置文件链接到各个实体类的Mapper文件,Mapper文件配置各个类需要对数据库进行的sql语句映射。每次与数据库交互,通过sqlSessionFactory得到一个sqlSession,然后得到映射器文件sqlSession.getMapper(),最后一次调用是JDK的动态代理(exlipse一直用Ctrl的鼠标左键点击,直到最后被发现,附上源代码)。

受保护的新实例(mapperProxy mapperProxy){

return(T)proxy . newproxyinstance(mapperInterface . get Class loader(),new Class[] { mapperInterface },mapper proxy);

发送方只需创建映射器接口并使用映射器接口。Mybatis将为Mapper接口生成一个动态代理对象。此动态代理对象实现了Mapper接口具有Mapper中定义的所有方法,并对其进行了增强。增强的逻辑是获取和执行sql语句。

动态代理:

通过实现InvocationHandler接口创建自己的调用处理程序;

通过为代理类指定类加载器对象和一组接口来创建动态代理类;

动态代理类的构造函数通过反射机制获得,其唯一的参数类型是调用处理器接口类型。

通过构造函数创建一个动态代理类实例,构造时调用处理器对象作为参数。

框架的核心原则

AOP面向方面编程(AOP)提供了另一种思考程序结构的方式,弥补了面向对象编程(OOP)的不足。除了类,AOP还提供了方面。面对关注点的模块化,比如横切多个类型和对象的事务管理。Spring的一个关键组件是AOP框架,你可以自由选择是否使用AOP。提供声明式企业服务,特别是取代EJB声明式服务。最重要的服务是声明式事务管理,它基于Spring的抽象事务管理。允许用户实现自定义方面,并使用AOP来改进OOP的使用。Spring AOP可以看作是对Spring的增强。AOP的实现甚至spring框架的核心代码,基本都是基于Java语言的反射机制(所谓反射机制就是在运行状态下,可以知道任何类的所有属性和方法;对于任何对象,都可以调用它的任何方法和属性;这种动态获取信息,动态调用对象方法的功能被称为java语言的反射机制。)。

AOP的主要功能是在不修改源代码的情况下,通过编织非核心功能代码来增强方法。那么Spring AOP底层是如何增强方法的呢?实现的关键在于代理模式的使用。代理模式的作用是为其他对象提供一个代理,控制对这个对象的访问,解决直接访问对象时的各种问题,比如要访问的对象在远程机器上。在面向对象的系统中,由于其他一些原因(对象创建开销很大,或者一些操作需要安全控制,或者进程外访问)等。

有两种代理:静态代理和动态代理。

IoIOC IOC不是一种技术,而是一种思想,一种重要的面向对象编程规则,可以指导我们如何设计出松耦合、更好的程序。有了IoC容器,创建和查找依赖对象的控制权就交给了容器,容器注入组合的对象。所以相对于传统的java servlet,它需要一系列繁琐的值、中文转换、值类型转换,更重要的是,它使得程序的整个系统结构非常灵活。

定制IOC容器的想法;

把Map做成容器,然后用工具解析xml文件来解析需要扫描的包。使用Java反射机制获取锁的所有方法和属性,并将它们注入Map容器。

DI依赖注入是指组件之间的依赖关系是由容器在运行时决定的,即容器动态地向组件注入一个依赖关系。依赖注入的目的不是给软件系统带来更多的功能,而是增加组件复用的频率,为系统搭建一个灵活的可扩展的平台。通过依赖注入机制,我们可以通过简单的配置,不需要任何代码,指定目标所需要的资源,完成自己的业务逻辑,而不需要关心具体的资源来自哪里,由谁来实现。

以上是SSM框架过程和原理的详细内容。更多关于SSM框架原理的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: