技术-202102-《架构探险-从零开始写java web框架》

工具类Util

  1. properties文件属性可用通用util工具类方法获取

  2. 判断非空工具类

  3. 流操作工具从输入流中获取字符串

  4. 编码和解码工具将URL编码和解码

  5. JSON和POJO转换

  6. 获取基本配置项工具(static final属性 Constant接口类)

助手类Helper

  1. JDBC数据库连接帮助类,关闭连接

  2. 数据库通用增删查改工具类

  3. 类加载工具(将项目所有类加载入set)

  4. 反射工具(创建实例,调用方法)

Ioc容器原理Inversion of controller 控制反转给框架:可以理解为将某个类依赖的成员注入到这个类中  

  1. beanhelper:定义bean助手,用于存放bean(class<?>)和    bean实例(object)的映射关系

  2. ClassHelper:获取想要类的集合,但是无法实例化对象。这时需要 ReflectionUtil反射工具类

  3. IocHelper依赖注入助手类(实现依赖注入功能):获取所有Bean类和bean实例的映射关系,先通过beanhelper获取所有Bean Map然后遍历这个映射关系,分别取出bean类和bean实例,通过反射获取类中所有的成员变量。继续遍历这些成员变量,再循环判断是否有Inject注解,若带有该注解,则从Bean Map中根据Bean类取出Bean实例,然后通过反射修改当前成员变量的值

  4. 利用注解区分 controller、server等类

  5. 实现将所有类加载到一个容器中

  6. ControllerHelper:封装Action Map 存放request和Handler对应关系

IOC容器管理的那些组成你应用程序的对象我们就叫它Bean, Bean就是由Spring容器初始化、装配及管理的对象

初始化框架

HelperLoader:ClassHelper。beanhelper。IocHelper。ControllerHelper这四个Helper类需要入口程序来加载他们,实际上是加载他们的静态块

MVC原理

Servlet类处理所有请求,从HttpServletRequest对象中获取请求方法和路径,通过ControllerHelper的getHandler方法获取Handler对象。先servlet处理,请求返回View and model视图

Request封装请求requestPath和requestMethod

请求参数对象Param(Map)

View(视图路径,Map)

MVC灵魂类DispatcherServlet(请求转发器)

  1. DispatcherServlet类继承Httpservlet类:先初始化相关Helper类

AOP(Aspect Oriented Programming 面向方面编程)横向拦截操作,比如性能分析、日志收集、安全控制等

代理模式-静态代理:写一个接口,和实现类,用代理类实例化 接口的实现类,并写代理方法调用实现类具体方法,并可在方法前后加before和after操作(这里before 和after是每个代理类都要写的,不易 )

动态代理1-JDK动态代理(原理反射):实现InvocationHandler,重写invoke方法。(before 和after方法都是在 动态代理类中, 易于代码维护) 前置增强,后置增强

CGlib动态代理:实现接口MethodInterceptor 重写 intercept方法。快速生产 代理对象。与JDK代理不同可以代理没有接口的

spring aop可以理解为拦截器框架

Spring +aspectJ 基于注解的 表达式拦截方法@Aspect,方面 

@pointCut【切点】(execution【拦截器】(。。。))

@Around 环绕增强 @Before前置增强 @After后置增强

ThreadLocal 可以理解为存放线程局部变量的容器(多线程情况下,变量不共享)原理有一个MAP存放线程对应的值

数据库连接是使用到,每个线程获取对应的连接。

Spring 事务

ACID 原子性,一致隔离 持久

@Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚。@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理。通过@Transactional注解就能让spring为我们管理事务,免去了重复的事务管理逻辑,减少对业务代码的侵入,使我们开发人员能够专注于业务层面开发

@Transactional注解标注的方法需要被代理。切面逻辑类似于@Around,在spring中是实现一种类似代理逻辑。

Spring Security 安全框架:继承 WebSecurityConfigurerAdapter 底层是Filter过滤器

获取用户信息 SecurityContextHolder.getContext().getAuthentication(); 获取当前请求 (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

Spring之@EnableRedisHttpSession注解

在集群系统中,经常会需要将Session进行共享。不然会出现这样一个问题:用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,系统B发现本机上没有这个用户的Session,会强制让用户重新登陆。此时用户会很疑惑,自己明明登陆过了,为什么还要自己重新登陆。

springSession+springSecurity结合使用实现redis管理session

分布式Session的解决方案

  • 使用cookie来完成(很明显这种不安全的操作并不可靠)

  • 使用Nginx中的ip绑定策略,同一个ip只能在指定的同一个机器访问(不支持负载均衡)

  • 利用数据库同步session(效率不高)

  • 使用tomcat内置的session同步(同步可能会产生延迟)

  • 使用token代替session

  • 我们使用spring-session以及集成好的解决方案,存放在Redis中

最后一种方案是本文要介绍的重点。

CXF(服务框架) SOAP(信息交换协议) REST(风格) ws

rest服务发布原理:

首先是注解@Controller、@RestController、@RequestMapping,启动的时候,spring 会自动加载解析相关的bean以及bean的方法,然后包装成HttpMthod对象,存储在AbstactMappingHandler抽象类里面的一个MappingRegistery对象里面,该对象以map的对象维持着所有的HttpMethod . (这一块的加载原理还需要看下). AbstactMappingHandler实现了MappingHandler接口,真正的核心实现类是:RequestMappingHandlerMapping

2.http请求接入的时候,首先走的是tomcat提供的servlet接口,然后在DispatchServlet里面完成寻找

首先是解析请求,这里会对请求进行warp操作,以及判断是否是mulit请求

然后根据请求从MappingRegistery查找httpMethod

根据httpMethod构建HandleExecutionChain,其内部包含了拦截器HandleInterceptor

然后根据定义的参数类型找到合适的ArgumentResovler,由ArgumentResovler来完成参数的解析和转换,ArgumentResovler持有做HttpMessageConverter,然后根据不同的类型进行转换

ArgumentResovler的入口实现累是ArgumentResovlerCompise,组合了所有的Resovler,每一个注解都有对应的Resolver,@RequestBody的Resovler的注册器是RequestMappingBodyProcessoer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HELLO XF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值