深入class文件结构
深入class文件结构JVM指令集简介首先将下面这段java代码对应编译成的class文件转化为Oolong语言后进行分析:
12345public class Message { public static void main(String[] args) { System.out.println("Hello World!"); }}
得到的.j后缀文件内容如下:
12345678910111213141516171819202122232425262728.source Message.java.class public super org/example/test/Message.super java/lang/Object.method public <init> ()V.limit stack 1.limit locals 1.var 0 is this Lorg/example/test/Message; from l0 to l5.line 3l0: aload_0 ...
深入分析iBatis框架之系统架构与映射原理
深入分析iBatis框架之系统架构与映射原理iBitis框架主要的类层次结构iBatis框架主要完成以下两件事情:
根据JDBC规范建立与数据库的连接、
通过反射打通Java对象与数据库参数交互之间相互转化的关系
iBatis是一种典型的交互式框架,前期准备好交互的必要条件,然后构建一个交互的环境,在交互环境中还划分成会话,每次会话也有一个环境。当这些环境都准备好了之后,剩下的就是交换数据
iBatis框架的设计策略方便的地写出SQL和方便地获取SQL的执行结果才是iBatis的核心竞争力
iBatis框架的一个重要组成部分就是其SqlMap配置文件,SqlMap配置文件的核心是Statement语句包括CRUD,iBatis通过解析SqlMap配置文件得到的所有Statement执行语句,同时会形成ParameterMap、ResultMap两个对象,用于处理参数和经过解析后交给数据库处理的SQL对象
数据映射的大致过程为:根据在Statement中定义的SQL语句,解析出其中的参数,按照其出现的顺序保存在Map集合中,并按照在Statement中定义的ParameterMap对 ...
Spring MVC的工作机制
Spring MVC的工作机制Spring MVC的总体设计使用Spring MVC,需要:
拓展一个路径映射器
定义一个视图解析器
定义一个业务逻辑的处理流程规则
在Service的init方法调用时,DIspatcherServlet执行SpringMVC的初始化方法,主要初始化的内容,可以在initStrategies方法中得知,主要包含以下八个流程:
initMultipartResolver:用于处理文件上传服务
initLocaleResolver:用于处理应用的国际化问题
initThemeResolver:用于定义一个主题,例如可以根据用户的喜好来设置用户访问的页面样式
initHandlerMappings:用于定义用户设置的请求映射关系
initHandlerAdapters:用于根据Handler的类型定义不同的处理规则
initHandlerExceptionResolvers:当Handler处理出错时,会通过这个Handler来统一处理
initRequestToViewNameTranslator:将指定的ViewName按照定义的RequestTo ...
Spring框架的设计理念
Spring框架的设计理念Spring的骨骼架构Spring的核心组件只有三个:Core、Context和Bean,而AOP、Web这样的上层特性功能都是在这三个的基础上构建的
设计理念三个核心组件中的核心是Bean组件,Spring可以给视为面向Bean编程
Bean对于Spring的作用就是Object对OOP的意义一样,Spring解决的一个非常关的问题就是,可以让你把对象之间的依赖关系转而用配置文件来管理,也就是依赖注入机制,而Ioc容器中存在的,就是被Bean包裹的对象
核心组件如何协调工作Bean包装的是Object,而Object必然有数据,如何给这些数据提供生存环境就是Context要解决的问题,对于Context来说就是要发现每个Bean之间的关系,然后为它们建立这种关系并进行维护,所以Context就是一个Bean关系的集合
而Core就是发现、建立和维护每个Bean之间的关系所需要的一系列工具,Core更像是一个Util
核心组件详解Bean组件Bean组件在Spring的org.springframework.beans包下,这个包下所有的类主要解决了三个问题: ...
几种Java对象拷贝工具
几种Java对象拷贝工具日常工作中时常需要做对象的转化和拷贝,例如将DTO转化为PO。如果采用简单粗暴的做法,直接使用get、set方法直接对两个对象做转化,这样做可以最大程度上自定义转化的字段,同时不存在浅拷贝的问题。这样做的问题是十分繁琐,需要自己手写各个字段的转化,这个时候就需要使用工具来简化开发,常用的工具大概由以下几种:
Apache BeanUtils
Spring BeanUtils
cglib BeanCopier
Hutool BeanUtil
Mapstruct
Dozer
Apache BeanUtils使用时需要引入以下依赖:
12345<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version></dependency>
准备好需要进行转化的两个对象,要注意的是,id字段 ...
深入理解Session与Cookie
深入理解Session与CookieCookie当一个用户通过HTTP访问一个服务器时,这个服务器会将一些Key/Value键值对返回给客户端浏览器,并且加上一些限制条件,当条件符合时,该用户下次访问该服务器数据又会被完整地带回给服务器
实际上考虑的是为了记录用户在一段时间内访问Web应用的行为路径
属性项当前Cookie有两个版本:Version 0和Version1,两者设置响应头的表示分别是 Set-Cookie 和 Set-Cookie2
两个版本的属性项有相同的部分,也有不同的地方
Version 0属性项:
NAME=VALUE:可以设置要保存的键值对,注意NAME不能和其它的属性项名称一样
Expires:过期时间,设置在该时间后Cookie失效
Domain:生成该Cookie的域名
Path:该Cookies生成的路径
Secure:如果设置了,那么只会在SSH连接时回传该Cookie
Version 1属性项,和0版本一致的不列举:
Version:指定版本
Comment:注释项
CommentURL:服务器为此Cookie提供的URI注释
Discard: ...
Tomcat的系统架构与设计模式
Tomcat的系统架构与设计模式Tomcat总体设计Tomcat的心脏有两个关键组件:Connector和Container。Connector是可以被替换的,一个Container可以选择对应多个Connector。多个Connector和一个Container形成了一个Service,有了一个Service就可以对外提供服务了。Service还有个生存环境,控制其生命周期,这个就是Server
ServiceTomcat中的Connector、Container可以作为一个整体,Container主要处理Connector接受的请求,而Service将两者组装在一起。一个Service可以设置多个Connector,但是只能有一个Container容器
Service接口主要是关联上述两者,但是没有在该接口中规定一定要控制其下方的组件的生命周期,所有组件的生命周期在Lifecycle接口中控制
Service的标准实现类是StandardService,它同时还实现了Lifecycle接口
StandardService中主要几个方法的实现逻辑:
setContainer:首先判 ...
Jetty的工作原理解析
Jetty的工作原理解析目前最活跃也是很有前景的一个Servlet引擎,架构比较简单,可拓展性强且非常灵活的应用服务器。其有一个基本的数据模型:Handler,所有可以被扩展的组件都可以作为一个Handler添加到Server中,Jetty来做管理
基本架构核心由Server和Connector两个组件构成。整个Server组件是基于Handler容器工作的,类似Tomcat的Container容器。Connector组件负责接受客户端的连接请求,并将请求分配给一个处理队列去执行
除了上述两个组件外,还有一些可有可无的,可以在此之上做拓展。例如JMX,可以定义一些Mbean加到Server中,当Server启动时,这些Bean会一起工作
整个Jetty的所有组件的生命周期管理都是基于观察者模板设计的,和Tomcat类似,每个组件都有一个观察者集合,当触发生命周期中的事件时会触发调用
Handler的体系结构其中主要有两种Handler类型,一种时HandlerWrapper,可以将一个Handler委托给另一个类去执行,例如将一个Handler加到Jetty中,那么就必须将这个Hand ...