springMVC是一个基于MVC架构的,用来简化WEB应用程序的框架;属于表现层的框架。
用户发送请求到前端控制器,前端控制器接受到请求调用处理器映射器,处理器映射器根据请求的URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则一并生成)返回给前端控制器,前端控制器通过处理器 适配器调用处理器,然后执行控制器,执行完成后返回视图和模型,处理器适配器将控制器执行结果视图和模型返回给前端控制器;前端控制器将视图和模型传给视图解析器,解析后返回具体视图,前端控制器对视图进行渲染视图(即将模型数据填充到视图中),前端控制器响应给用户。
springMVC的入口是一个servlet即前端控制器。 springMVC是基于方法开发(一个URL对于一个方法),请求参数传递到方法的形参,可以设计为单例模式或多例;建议用单例,默认是单例的。 为什么建议用单例? 1、性能(不用每次请求都New对象)。 2、不需要多例(不要在控制器中定义成员变量)。
它是一个轻量级的开源的框架,创建性能好,易于测试,可重用代码;它基于IOC(反向控制)和AOP(面向切面)的架构多层Jzee(企业级应用)系统的框架。 优点: 1、能有效地组织中间层对象,不管是否使用了EJB(企业级JavaBean)。 2、消除了在工作中对单例模式的过多使用,降低了系统的可测试性和面向对象。 3、消除各种自定义格式的属性文件的需要,易于单元测试。 4、把对接口编程而不是对类编程的代码减少,养成好的编程习惯。 5、使用它创建的应用尽可能少的依赖于它的(APIS)编程接口。
它的两大核心:IOC(控制反转)和AOP(面向切面)。 1、IOC:降低了程序的耦合度,使项目成为可插拔的组件式工程。 2、AOP:使开发过程精力得到释放,更专注去解决客户需求,可维护性高。 3、它提供的事务管理机制,采用声明的方式来配置事务,从而维护时无需改动源代码,解决了程序硬编码的问题。 4、它提供的DAO(数据存取对象)模板使持久层多了一种用途。 5、它可以整合当前任何一种框架,使在管理项目时更清晰明确。 spring管理事务有2种方式。 1、编程式事务,在代码中硬编码。 2、声明式事务,在配置文件中配置;(推荐) 声明式事务分为2种: 1、基于XML的声明式事务。 2、基于注解的声明式事务。
依赖注入是实现控制反转的一种思想(另一种是依赖查找)。 在开发的过程中,我们需要某个类的实例时,是由使用者为我们提供该类的实例,而不是自己去获取。 实现依赖注入的两种方式: 1、使用构造方法注入。 2、set方法注入。
IOC是spring的核心之一。 控制反转是指,我们在获取对象的时候,由之前的主动变成了被动接收;也就是说在编程某个类时,只需要提供一个接口类型的类成员,并不需要关系具体的实现类,而由使用者在使用时提供,降低了类与类之间的耦合度。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久框架。 消除了几乎所有的JDBC(Java数据库连接)代码和参数的手工设置以及对结果集的检索封装。可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通的Java对象)映射成数据库中的记录。 MyBatis工作原理
由pivotal团队提供的全新框架,目的是用来简化新spring应用的初始化搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不需要定义样板化的配置。 springBoot组件 1、springBoot自动配置:spring启动能够检测某些框架的可用性,一旦检测到框架,它就自动配置它。 2、springBoot Core:是其他spring模型基础,它提供了某些功能,可以通过验证自行完成。 3、springBoot starters:帮助启动项目,它会自动添加启动 项目和依赖项。 springBoot 特点 1、用来实现微服务 2、自动配置 3、自定义配置 4、模块化 5、独立打包,直接运行 6、内嵌服务器(如:Tomcat服务器) 7、spring Cloud的基础
spring Security是一个强大的和高度可制定的身份验证和访问控制框架。它是保证基于spring的应用程序安全的实际标准。 主要功能: 1、认证:验证用户名和密码是否合法(是否系统中用户) 2、授权:是系统用户不代表你能使用某些功能,因为你没有对于的权限 3、防御会话固定,点击劫持,跨站点请求伪造等攻击 4、servlet API集成 5、与springWebMVC的可选集成
什么是多线程 一个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。 如:进程A车间,线程A车间的工人; 多线程技术可以提高程序的执行效率,多线程是属于一种并发手段,是多任务的一种特别的形式,但多线程使用了更少的资源开销。 三种创建线程的方法: 1、实现Runnable接口 2、继承Thread类本身 3、通过Callable和Fature创建线程 多线程的原理 1、同一时间,CPU只能处理一条线程,只有一条线程在工作(执行) 2、多线程并发(同时)执行,其实是CPU快速地在多条线程直接切换 3、如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象 如果线程非常多,会发生什么情况? 1、CPU会在N多线程之间切换,CPU会累死,消耗大量的CPU资源 2、线程的执行效率降低 线程的生命周期 1、新建状态 2、就绪状态 3、运行状态 4、阻塞状态: 1、等待阻塞 2、同步阻塞 3、其他阻塞 5、死亡状态 线程的几个主要概念: 1、线程同步 2、线程间通信 3、线程死锁 4、线程控制:挂起,停止和恢复 乐观锁和悲观锁 1、乐观锁持乐观状态,就是假设我的数据不会被意外修改,如果修改了就放弃从头再来。 2、悲观锁持悲观状态,就是假设我的数据一定会被修改,那干脆直接加锁得了。
Java集合简介
collection接口的三个子接口:
1、set
2、list
3、Queue
集合大致可分为以下四种体系:
1、set:无序,不可重复的集合
2、list:有序,可重复的集合
实现list接口常用的类有:LinkedList ArrayList Vector和Stack.
3、Map:则代表具有映射关系的集合
4、Queue:Java5中新增加了,代表一种队列集合实现
集合与数组的区别
1、数组长度初始化指定,只能保存定长的数据,集合可以保存数量不确定的数据,还可以保存具有映射关系的数据。
2、数组元素即可以基本类型的值,也可以是对象,集合只能是对象,实际保存对象的引用变量,基本类型的变量要转成对于的包装类才能放入集合中。
map和collection是Java集合框架的根接口。map里的key是不可重复的,用于保存具有映射关系的数据。
什么是缓存穿透
在正常情况下,查询的数据都存在,如果请求一个不存在的数据,也就是缓存和数据库都查不到这个数据,每次都会去数据库查询,机会造成数据库压力增大。
解决:
1、缓存空值,即就是将缓存中没有的key设置为对应只null。
2、布隆过滤器(BloomFilter),它类似于一个Hbase set用来判断某个元素(key)是否存在于集合中。我们把数据的key放在布隆过滤器中,每次查询都会进行判断,如果没有就直接返回null,它没有删除操作,可以结合缓存空值。
什么是缓存雪崩
当某一时刻发送大规模的缓存失效情况,比如缓存服务器宕机了。
解决:
1、利用集群,降低服务宕机的概率。
2、ehcache本地缓存+Hystrix限流和降级。
二级缓存本地考虑redis Cluster完全不可以的时候,可以支持一阵。
使用Hystrix进行限流或降级,如1秒5000请求,设置为2000请求,其余走逻辑流。
什么是缓存击穿
在高并发的情况下,大量的请求同时查询同一个key时,此时这个key正好失效了,就会导致同一时间这些请求都会去查询数据库,会造成某一时刻数据库请求量过大。
解决方法:
1、采用分布式锁
只有拿到锁的第一个请求(线程)去请求数据库,然后插入缓存,当然每次拿到锁的时候都要去查询一下缓存有没有。
对于热点数据,当缓存失效以后会存在大量的请求过来,然后打到数据库去,从而导致数据库奔溃的情况。 解决方法: 1、设置不通失效时间 2、采用缓存击穿办法,加锁 3、设置缓存永不失效,就是采用定时任务对快要失效的缓存进行更新缓存和失效时间。