由于最近要面试了 所以把最近的学习的内容总结了一下 也方便自己在移动端看
Spring Bean的实例 和事务关系
1 关于spring Bean的实列的区别
Spring 默认的是singletong 默认是单例的 线程安全
singletong
Spring 事务的传播行为
REQUIRE (默认操作)
如果当前没有事务,就新建一个事务,如果已经保存在一个事务
加入到这个事务中
REEUIRES_NEW
新建事务 如果当前没有事务 就以非事务方式执行
SUPPORTS
支持当前事务,如果当前没有事务 就以非事务的方式执行
NOT_SUPPORT
以非事务的方式执行操作,如果当前存在事务 就把当前事务挂起
MANDTORY
使用当前事务 如果当前没有事务 就抛出异常
NEVER
以当前非事务方式执行 如果当前存在事务,则抛出异常
NESTR
ActiveMQ
解决了什么问题
削峰
解耦
异步
使用场景
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
在本项目中的实际应用
Activemq 在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信 息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可 以使用 activemq。一旦后台对商品信息进行修改后,就向 activemq 发送一条消息,然后通过 activemq 将 消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处
发布订阅模式的通信方式: 默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适 用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个 id,在订阅是向 activemq 注册。发布消息和接收消息时需要配置发送模式为持久化。此时 如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。
点到点模式: 如果消息发送不成功此 消息默认会保存到 activemq 服务端知道有消费者将其消费,所以此时消息是不会丢失的。
solr有关问题
介绍solr 在项目中使用
solr 是基于Lucene的全文检索应用程序 可以部署到Tomcat服务器中
1 为什么要用 有什么好处的呢
Lucene 只是负责数据存储 为solr只是一个引擎提供搜索插入操作 跟数据库解释器一样
假如 使用使用数据库来查询1000条数据 你想从数据库中查询的时候 你只能使用Like去查询
他会遍历每个字去迷糊匹配效率低,而且有些是无法查找的 然而solr 做的事情就是 分词 然后去匹配你要搜索
的词就好了
但是为什么还要使用solr
因为solr 没有表关系 没有事务 不安全
Mysql
那么问题来了 Mysql 为什么不行
Mysql 什么时候可以建立索引
Mysql建立索引的有点
InnoDB存储结构
数据库事物并发的问题
底层数据模型
b+树模型
b-树和b+树模型的区别
Dubbo原理解析
核心部分包括:远程通讯 提供对多种基于长连接的
集群容错
自动发现
Spring 常见问题
Spring的核心
控制反转和AOP(面向切面编程)思想
1 Spring框架的作用
简化了Java的开发
在平常我们创建对象都是有通过的new的方式进行对象的创建
然而使用Spring框架 通过IOC控制反转 帮我们创建对象
2 它解决了什么问题
3
IOC称之为控制反转,简单来说就是将对象的创建的权利和对象的声明周期的管理过程交给Spring框架来处理,在这个开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要的时由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转。
其中,
在创建对象的过程中spring可以 根据配置对象的属性进行设置,这个过程称为依赖注入(DI)
Spring的实现
Spring Ioc容器(ApplicationContext)负责创建Bean,并通过容器将这些创建的Bean注入到需要他们的消费者Bean中。Spring提供使用Xml、注解Java配置的方式创建和注入,容器解析这些配置信息进行Bean的初始化,配置和依赖管理
Spring基于XML注入Bean的几种方式
1 set方法注入
2 构造器注入
Spring的自动装配
在Spring中对象无需自己查找或创建与其他关联的其他对象,有容器负责把需要相互协作的对象引用赋予各个对象 使用autoWire来自动装在模式
##### Spring框架XML配置中的五种自动装配
no: 默认的方式是不进行装配的 通过手工设置的ref属性来进行装配Bean的
ByName:通过bean的名称进行自动装配 如果一个bean的property和另一个bean的property的相同则自动装配
byType:通过参数的数据类型进行自动装配。
4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
(5)autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
Spring框架中都用到了那些设计模式
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。
Spring事务的种类
声明式事务 声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
编程式事务 编程式事务管理使用TransactionTemplate
声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。
声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。
SpringAOP的理解
什么是AOP
AOP(Aspect-OrientedProgramming),也就是面向切面编程。也可以这样理解,学java的应该都知道面向对象编程(oop),而OOP是从静态解读考虑程序结构,但AOP是从动态角度考虑程序运行过程。也可以说AOP是OOP的补充和完善。OOP引入了封装、继承和多态性等概念来建立一种对象层次结构, 用以模拟公共的一个集合。当我们需要为分散的对象引入公共行为的时候,则OOP显得无能为力了。也就是说,OOP允许你定义从上到下的关系,但并不适合从左到右的关系,例如日志功能。日志代码往往水平的散步在所有对象层次中,而与它所散步到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切代码,在oop设计中,他导致了大量代码的重复,而不利于各个模块的重用。
而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将哪些影响了多个类的公共行为封装到一个可重用模块,并将其名为'Aspect',及方面。 所谓"方面",简单的来说就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来。便于减少系统的重复代码,降低模块间的耦合度等。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取信息的方式,对该信息进行装饰,以取代鱼油对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
谈谈你对代理模式的理解
AOP的主要功能
日志记录 性能统计 安全控制 事务处理 异常处理
AOP和OOP 的区别
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
主要是在静态的领域
AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果
在不破坏源码的状态下对 程序进行
主要是在动态的领域
AOP代理模式主要分为
JDK 代理 : 基于接口的动态代理技术
cglib 代理:基于父类的动态代理技术
class UserService{
add();
search();
del();
}
目标对象 UserService
这些方法就是:就是连接点
SpringAOP的思想
AOP思想 就是面向切面编程是OOP的的延续
AOP可以完成如事务控制,日志记录,权限校验一一系列工作,方便开发进行。
就是面向切面编程
基本原理:通过生成代理对象方式不同,对原来的方法进行增强 在Spring中常用的 代理模式有JDK动态代理要求被代理的对象必须实现该接口
使用该接口动态代理技术 接口可以多实现
若使用解耦
一类为CGlib动态代理实现 可以对任何实现代理,原理为继承代理 若类被final修饰 则无法代理
而继承只能单继承
JDK动态代理和CGlib代理的区别
Spring
连接点: 只要在目标类中的方法就是连接点
切入点:只要是被增强的方法就是就是切入点
切面(ASPECT):是切入点和通知的结合
AOP实现的增强的方法有哪些
前置通知
后置通知
环绕通知
异常通知
最终通知
AOP事务配置
Spring工作流程的原理和执行顺序
1 Web.xml中的ContextLoadListern监听器
2初始化ContextLoadListener中的contextInitialized
3contextInitialized方法中调用父类(ContextLoader)的initWebApplicationContext方法
4initWebApplicationContext 方法中执行三个任务(主要就是Spring容器加载)
1创建WebApplicationContext容器
2加载context-param中的spring配置文件
3初始化配置文件中及创建配置文件中的bean
4web容器停止时候回执行ContextLoaderListener的ContextDestory方法销毁容器
1首先解析spring,xml配置文件 把其中<bean>解析为BeanDefinition 存入beanFactory
2执行beanFactory的后处理器
3接下来由beanFactory 创建每个类对应的单例对象 利用了反射根据类名创建每个类的实例对象
4执行 bean 的后处理器, 它其中有两个方法,会在 bean 的初始化方法前后被调用会把这些结果 存入 beanFactory 的 singletonObjects 这样一个map集合里
5依赖注入
Spring-Data
ORM思想(对象关系映射)
建立实体类和表的关系
建立实体类中属性和表中字段的关系
Spring-data 执行逻辑
Hibernate框架和Mybatais的区别
Spring-Data -solr
Spring-data-redis
SpringMVC
SpringMVC 执行流程
核心控制器
谈谈你对SpringMVC 的理解
1 传统MVC架构
控制器(就相当于是Controller层)接受用户的用户发送的请求 然后经过数据的处理 然后把数据发送给service层也就是(Model层分为 service层 和 Dao层 数据库操作 )层
然后推送模型数据模型 给视图层 视图层返回响应的数据 就是用户所看到的
2 改进型的MVC架构 降低各个模块之间的耦合 主要有一个 不在以往的各个模块相互依赖了
而是 通过设计一个控制器 用来 接收和发送请求 用户接收请求和返回响应的数据都有控制器来完成
前端控制器 把接收的用户的请求发送到Model中(service、dao)中 然后 把查询的结果响应到前端控制器
前端控制器 把查到的结果 发送给视图层 视图层通过处理 把响应的结果返回给控制器 然后前端控制器把响应的结
返回给用户。
SpringMVC内部执行流程
HandlerMapping 功能是 寻找Controller 根据URL请求去匹配bean的属性url 从而获得controller
SpringBoot
四大特性
集合
Collection集合中
List接口
实现类 ArrayList
实现类 LinkedList
实现类 Vector
ArrayList 底层实现
Set接口
实现类 HashSet
优点:
缺点:动态数组的实现 不适合频繁插入和删除操作 因为每次插入和删除都需要 都需要移动数组的元素
插入的和删除 每次都是创建一个新的数组 对老的数组进行遍历 赋值给新的数组
LinkedList(分为单链表和双向链表)
优点:LinkedList 是由双链表实现的,增删由于不需要是按移动底层数组数据,底层是链表实现的 只需要修改链表节点指针,对元素的插入和删除效率比较高
缺点 :遍历效率较低 HashMap和双链表也有关系
是一个继承于AbstractSequentialList的双向链表,他也可以被当做堆栈、队列或双端队列进行操作
LinkedList的本质是双向链表
主要分为两个成员 header和size
header是双向链表的表头 它是通过双向链表实现的,每一个元素存储本身内存元素还存储下一个元素的地址 增删块查找慢
Vector 基于数组 线程安全 效率低
链表和数组的区别
数组静态分配内存 链表动态分配内存 数组在内存中是连续的 而链表在内存中是不连续的
数组的优点
随机访问性强
查找速度快
接口Map<K,V>
有三个实现类
实现类:HashMap类
JDK1.8之前 HashMap和HashTable的底层实现都是数组+链表结构实现的
添加 删除 获取元素都是先计算Hash值 根据Hash和table.length计算index也就是table数组的下标 然后进行相应的操作
在JDK1.8以前版本中,HashMap的实现是数组+链表,它的缺点是即使哈希函数选择的再好,也很难达到元素百分百均匀分布,而且当HashMap中有大量元素都存到同一个桶中时,这个桶会有一个很长的链表,此时遍历的时间复杂度就是O(n),当然这是最糟糕的情况。
在JDK1.8及以后的版本中引入了红黑树结构,HashMap的实现就变成了数组+链表或数组+红黑树。添加元素时,若桶中链表个数超过8,链表会转换成红黑树;删除元素、扩容时,若桶中结构为红黑树并且树中元素个数较少时会进行修剪或直接还原成链表结构,以提高后续操作性能;遍历、查找时,由于使用红黑树结构,红黑树遍历的时间复杂度为 O(logn),所以性能得到提升。
HashMap 是线程不安全的
当添加一个元素的时候 就首先计算元素的key的Hash值 以此确定插入数组的位置 但是可能存在同一Hash值得元素已经被放到同一数组同一位置 这时就添加到同一hash值的元素后面,他们在数组的同一位置,但是形成了链表,同一个链表上的Hash值都是相同的 所以说数组存放的是链表而当链表长度太长的时候,链表就转为红黑树这样大大提高了查找的效率
线程不安全
高效
支持null
实现类:Hashtable类
线程安全
低效
不支持null
TreeMap
能够把它保存的记录根据键排序,默认的是键值升序排序
RestTemplate 完成在服务端发生请求
针对 框架之间的区别
1 分别简单介绍每个框架的特点
2 介绍每个框架之间的区别
1 介绍Spring和SpringMVC的区别
1 首先来说Spring 框架 简化了开发人员对java的开发
2 原先我们在未使用Spring的时候创建对象的权利 在开发人员手中 但是由于Spring框架提供了IOC机制 控制反转 就是创建对象的权利交由Spring框架 管理 开发人员不用操心对象创建的生命周期
3 方便解耦 简化开发
通过Spring提供的IOC容器 我们可以将对象之间的 依赖关系交给Spring进行控制 有了Spring 用户不必在为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
¥¥¥¥4 AOP 编程支持
通过Spring提供的AOP功能 方便进行面向切面编程,许多OOP不易实现的功能可以通过AOP实现
4 方便继承各种优秀框架
5 Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。(在容器的分布上SpringMVC是位于Spring容器之上的)
二 SpringMVC框架的特点
1 相较于传统的页面请求来说
SpringBoot 核心功能点
自定配置
SpringBoot cli
actuato
Redis
为什么要用Redis
网站前台 首页加载广告的时候 是从数据库中访问的
如果很多人访问 每次都访问数据库 对于数据库压力很大
所以用redis 减轻数据库的压力
2 主要是缓存数据到内存
能到本地持久化吗?
可以到本地持久化的
持久化方案分别有如下
1.RDB
RDB方式的持久化是通过快照完成的 当符合一定条件是redis会自动将内存中的数据进行快照持久化到硬盘
RDB是redis默认采用的持久化方式 在redis.conf 配置文件中配置
列如
save 900 1 每个条件之间是或的关系 save 900 1 表示 15分钟内 至少一个键被更改则进行快照
RDB问题总结
通过RDB方式实现持久化 一旦Redis异常退出 就会丢失最后一次的快照以后更改的所有数据 若要避免这样的问题 可以考虑使用AOF方式持久化
2.AOF
默认情况下Redis是没有开启AOF方式的持久化 当Redis每增加一条数据 Redis就会把数据增加到硬盘中。
区别
RDB:可以设置间隔多长时间保存一次(redis不用任何配置默认的持久化方案)
优点:让redis的数据存取速度变快
缺点:服务器断电时会丢失部分数据(数据的完整性得不到保障) AOF:可以设置实时保存
优点:持久化良好,能够保障数据的完整性
缺点:大大降低了redis系统的存取速度
项目职责描述
商品管理系统的实现:
责任描述:包括商品品牌和商品两个模块。实现商品添加修改删除、上架下架、商品库存的修改等。
商品添加中 会涉及到图片上传和和富文本编辑器
其中图片上传使用时FastDFS 服务器实现图片上传 但是在商品添加这个阶段 会有一个模块业务逻辑实现较为复杂 添加商品信息的时候
需添加商品的规格时候 会涉及到商品sku 当用户 现在选择一个规格 而页面会自动生成sku列表 并保存到数据库
但是问题来了 当用户选择规格的时候 下载的sku列表是怎么生成的吗????
这里就要涉及到深克隆和浅克隆技术
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
其实深克隆和浅克隆 就是是否改变对象内存的地址
回到上面的思路
若要 实现动态的生成sku列表 就需要使用深克隆 进行对spu 的列表进行深克隆
首先要准备一个默认的sku列表
获取选择的规格
sku列表是根据选择规格生成的 所以遍历选择的规格 生成新的规格列表
通过遍历规格列表 最终实现就是在页面动态生成sku列表
搜索系统
提供服装信息的搜索功能,可根据价格区间,品牌,尺码,种类等信息进行搜索
搜索系统的实现
1 首先要考虑