2019-07-28

由于最近要面试了 所以把最近的学习的内容总结了一下 也方便自己在移动端看




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 首先要考虑

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容