架构探险 从零开始写JAVAWEB笔记

  • 第一章: 介绍IDEA的使用,写了个简单的SERVLET、JSP,部署到TOMCAT,展示了个HELLO WORLD.
  • 第二章: 需求分析(WHAT TO DO 业务上的分析)、系统设计(系统怎样设计、技术选型、数据库设计BALABALA、用例、界面原型、URL规范等等)、开发(搭建基础环境【框架环境】、规划项目目录、数据库与MODEL编写、编写基础类及基础架构【拦截器之类的】、),以及使用SERVLET+JSP简单的完成了一个小功能,同时也暴露出了一些问题。Servlet数量过多,请求参数获取麻烦,自己管理依赖,耦合度过高(无AOP)。
  • 第三章: 搭建轻量级JAVA WEB框架。为了解决上面存在的问题~ 我们打造一个框架。这个框架呢~ 把各个Servlet集成在一起, 名字叫做Controller,有一系列的Action标注的方法来对应各个URL、并且呢~Service方法通过注入而不是自己new、能够自动处理请求和封装请求参数、返回View类对象表示JSP页面、返回Data类表示JSON数据。
    • 作为一个框架, 首先要低耦合, 不能硬编码~ 所以要搞一个配置文件来记录需要用到的一些可变项(JDBC啊、静态资源位置什么的)并且编写相应的读配置文件的UTIL类。
    • 为了实现利用注解(Action、controller...)来达成一些功能, 首先要定义 这些注解, 然后我们首要任务是将这些注解对应的类管理起来~ 那么怎么弄呢? 写一个ClassUtil类, 能够实现一个核心功能(将包下的所有类文件进行加载,并且将加载过后的 Class类放进一个ClassSet中),再写一个ClassHelper类, 能够实现获取应用包下的Bean类(Service、Controller)【通过注解从所有类中过滤出来】。
    • 实现BEAN容器。 封装一个ReflectionUtil, 再定义一个BeanHelper(里面定义一个BeanMap<Class, Object>,将新NEW出的对象封装进来)
    • 实现依赖注入。遍历所有的BeanMap,通过反射得到 每个Bean中的Field是否包含注入的注解, 然后再通过反射得到Field的类型,再通过反射设置进去。
    • 依赖 注入搞定了, Bean容器也搞定了, 现在要解决Controller啦。这个Controller要干嘛呢? 我们要根据Action中的http 方法和url 得到对应的方法。第一步, 定义一个Request类, 封装请求参数和请求路径。第二步,定义一个Handler类,封装一个Controller类以及action方法。第三步, 定义一个ControllerHelper类, 用于初始化并存放ACTION_MAP<Request, Handler>。这样不就解决问题了吗, 只要得到http方法和url, 就可以封装一个Request, 然后找到对应的Handler。
    • 然后写一个HelperLoader类来加载这些Helper类。
    • 定义Param(封装所有请求参数)、View(封装路径和数据)、Data(封装model),编写请求转发器DispatcherServlet(init时加载Helper类并且注册处理JSP和静态资源的Servlet、Service时获取请求参数、封装param、得到Action、调用方法、返回数据)。
    • 总结: 通过最后这个DispatcherServlet来处理所有的请求, 根据请求信息从ControllerHelper中获取相应的Action方法,然后使用反射技术调用Action方法,同时传入需要的参数,拿到返回值并根据类型进行不同的处理。
  • 第四章:使框架具备AOP特性。
    • 代理是啥/代理模式是? 经济人, 具体业务我不干, 但是我管控全局。
    • 静态代理, 。。。
    • JDK动态代理:具体细节还是没有琢磨, 大致是JDK在运行期间, 动态的生成的一个class代理类。步骤是先实现一个接口,在接口里实现invoke方法【before、targetmethod、after】,然后通过proxy.newProxyInstance搞出来。【书上的说法也不错:用定义的DynamicProxy类(实现invocationhandler)去包装HelloImpl实例,然后再调用JDK给我们提供的Proxy类的工厂方法newProxyInstance去动态地创建一个Hello接口的代理类,最后调用这个代理类的方法】
    • CGLIB:在运行期间动态生成字节码的工具。
    • AOP,从具体业务逻辑中剥离出通用业务逻辑,比如性能监控、日志记录、权限控制。也就是说,通过AOP,可以解决代码耦合的问题,使得类的职责更加单一。
    • 动态代理为什么比静态代理犀利?动态代理只有一个代理类,通过注入的object来实现代理类的不同(底层反射)、而静态代理,只能代理一种类。
    • AOP五种增强, 前增强, 后增强, 环绕增强, 异常增强, 类增强(前4种属于方法增强, 最后一种是增强类, 在类中动态注入方法)
    • CGLIB创建代理慢, 但运行速度快, JDK代理相反。
    • AOP 几个名词, 切面(切点【要在哪些方法上动手脚】+增强类【包含增强方法的类】)、连接点(当前拦截到的方法)、目标对象、增强(方法)、引入(类)。实际上要做的就是定义切面类。
    • SpringAOP 非主流, 最终落地的还是spring+AspectJ,几种方式:
      • 基于注解:通过AspectJ execution表达式拦截方法。
      • 基于注解:通过AspectJ @annotation表达式拦截方法。
    • 开发AOP框架
      1. 一波操作真是把我打醉了, 前面的那些东西快忘了, 其实最关键的还是整个问题的思路以及对应到各个类的职责划分。
      2. 首先定义了一个Aspect注解: 用于标注在某个类上,使其成为切面类(并且注解的值为需要被代理的类)。
      3. 定义一个代理接口proxy(提供一个doProxy方法(需要ProxyChain))、代理抽象类AspectProxy(实现doproxy逻辑)、具体ControllerAspect(实现before、after)
      4. 定义一个代理管理器(创建代理对象, interceptor执行 proxychain的doproxychain方法)
      5. 定义proxychain(代理链,一个链上拥有多个代理对象,顺序执行代理方法)
      6. doproxy和doproxychain这俩方法太6了相辅相成构成了链式调用,简单来说,就是先调用doproxychain然后,doproxychain会按顺序调用doproxy,而doproxy在before后就会卡住,再执行doproxychain,由此反复,得到一个before链,然后执行被代理类的方法,然后反着执行after最后返回结果。
    • ThreadLocal及自己实现
      1. ThreadLocal为每一个线程提供了独立的副本, 相当于线程独占变量。 用处? 普通static 被各个线程调用会被共享, 而使用static ThreadLocal包装后, 是线程独占的。
      2. ThreadLocal简化实现就是用了一个并发map,map<Thread, T>这样。
    • 事务管理
      • 事务的ACID
      • 由事务并发引起的问题: 脏读、 不可重复读、 幻读
      • 事务隔离级别: 读未提交、 读已提交、 可重复读、 序列化
      • 事务传播行为
    • 事务代理机制: 通过AOP在方法执行前 开启事务、 方法执行完提交事务。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 《架构探险 从零开始写Java Web框架》笔记 第二章,为Web应用添加业务功能 需求分析与系统设计 这一章书中...
    xiaogmail阅读 2,426评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,900评论 25 707
  • 区块链(英语:blockchain或block chain)是用分布式数据库识别、传播和记载信息的智能化对等网络,...
    福尔摩斯华森阅读 2,138评论 0 1
  • 我和H君算起来也有五年了吧,但是至始至终在我的记忆里H君总是有一副像被人遗弃的小狗的气质,像是落寞的小狗,...
    常瑾恩阅读 328评论 2 1
  • 庭前美人不含羞,数朵尚盈盈。 引来十只蜂,嗡嗡嗡,沐清风,展歌喉。 谁家夫人早采药,不见青丝,亦娉婷。
    蓝青果阅读 226评论 0 1