本文给大家分享小编一些心得体会,主要是学习地对地导弹(地对地导弹)框架之后的收获吧,重点给大家介绍地对地导弹(地对地导弹)框架流程以及原理分析,通过图文实例相结合给大家介绍的非常详细,需要的朋友参考下吧
前言:学地对地导弹框架已经有很长时间,今天来复习一下
地对地导弹(地对地导弹)图示流程:
春天核心: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框架原理的信息,请关注我们的其他相关文章!