工具类Util
-
properties文件属性可用通用util工具类方法获取
-
判断非空工具类
-
流操作工具从输入流中获取字符串
-
编码和解码工具将URL编码和解码
-
JSON和POJO转换
-
获取基本配置项工具(static final属性 Constant接口类)
助手类Helper
-
JDBC数据库连接帮助类,关闭连接
-
数据库通用增删查改工具类
-
类加载工具(将项目所有类加载入set)
-
反射工具(创建实例,调用方法)
Ioc容器原理Inversion of controller 控制反转给框架:可以理解为将某个类依赖的成员注入到这个类中
-
beanhelper:定义bean助手,用于存放bean(class<?>)和 bean实例(object)的映射关系
-
ClassHelper:获取想要类的集合,但是无法实例化对象。这时需要 ReflectionUtil反射工具类
-
IocHelper依赖注入助手类(实现依赖注入功能):获取所有Bean类和bean实例的映射关系,先通过beanhelper获取所有Bean Map,然后遍历这个映射关系,分别取出bean类和bean实例,通过反射获取类中所有的成员变量。继续遍历这些成员变量,再循环判断是否有Inject注解,若带有该注解,则从Bean Map中根据Bean类取出Bean实例,然后通过反射修改当前成员变量的值
-
利用注解区分 controller、server等类
-
实现将所有类加载到一个容器中
-
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(请求转发器)
-
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