- 第一章: 介绍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框架
- 一波操作真是把我打醉了, 前面的那些东西快忘了, 其实最关键的还是整个问题的思路以及对应到各个类的职责划分。
- 首先定义了一个Aspect注解: 用于标注在某个类上,使其成为切面类(并且注解的值为需要被代理的类)。
- 定义一个代理接口proxy(提供一个doProxy方法(需要ProxyChain))、代理抽象类AspectProxy(实现doproxy逻辑)、具体ControllerAspect(实现before、after)
- 定义一个代理管理器(创建代理对象, interceptor执行 proxychain的doproxychain方法)
- 定义proxychain(代理链,一个链上拥有多个代理对象,顺序执行代理方法)
- doproxy和doproxychain这俩方法太6了相辅相成构成了链式调用,简单来说,就是先调用doproxychain然后,doproxychain会按顺序调用doproxy,而doproxy在before后就会卡住,再执行doproxychain,由此反复,得到一个before链,然后执行被代理类的方法,然后反着执行after最后返回结果。
- ThreadLocal及自己实现
- ThreadLocal为每一个线程提供了独立的副本, 相当于线程独占变量。 用处? 普通static 被各个线程调用会被共享, 而使用static ThreadLocal包装后, 是线程独占的。
- ThreadLocal简化实现就是用了一个并发map,map<Thread, T>这样。
- 事务管理
- 事务的ACID
- 由事务并发引起的问题: 脏读、 不可重复读、 幻读
- 事务隔离级别: 读未提交、 读已提交、 可重复读、 序列化
- 事务传播行为
- 事务代理机制: 通过AOP在方法执行前 开启事务、 方法执行完提交事务。
架构探险 从零开始写JAVAWEB笔记
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 《架构探险 从零开始写Java Web框架》笔记 第二章,为Web应用添加业务功能 需求分析与系统设计 这一章书中...
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...