spring 的特点:
spring 是分层的,一站式,轻量级开源框架.
分层: 表现层 jsp/servlet
业务层: service
持久层 : dao/mapper
一站式: spring 提供了各层的解决方案。
表现层: springmvc
业务层: IOC,AOP
持久层: mybatis,hibernate
轻量级: spring 取代了EJB 的低效,复杂,使用spring 是非侵入式的。
spring 的核心: IOC 和AOP
IOC: 控制反转,将对象创建的权力交给spring 工厂进行管理.
AOP: 面向切面编程,基于动态代理的功能增强方式.
IOC:控制反转也叫依赖注入,利用了工厂模式将对象交给容器管理,只需要在spring 配置文件中配置相应的bean 以及设置相关的属性,让 spring 容器来生成类的实例对象以及管理对象。在spring 容器启动的时候,spring 会把你在配置文件中的bean 都初始化好,然后在你需要调用的时候,就把他已经初始化好的那些bean 分配给你需要调用的那些bean 的类,分配的方法就是调用 A 的setter 方法来注入,而不需要你在A里面 new 这些bean 了.
AOP: aop 实现原理其实是java 动态代理,但是jdk 动态代理必须实现接口,所以spring 的动态代理是使用cglib 这个库来实现的,cglib 使用了asm 这个直接操纵字码的框架,可以做到不实现接口的情况下完成动态代理.
DI:依赖注入,在spring 容器中创建管理多个对象,通过property 标签将对象注入到需要依赖的对象中.
bean 的作用域:
一共有5种。
项目中开发通常会使用的: singleton 单例 在一个spring 容器中,对象有且只有一个实例(默认)
prototype 多例 在一个spring 容器中,存在多个实例,每次getbean 的时候都会返回一个新的实例.
(request,session,global-session)
spring 最长使用的一些注解
@controller @RestController
@Service
@Repository
@Component
@Mapper
@Id ,@Colum
@RequestMapping
@ResponseBody
@Autowired
AOP 的使用场景:1:日志的纪录 2:权限控制 3:缓存技术 4:事务的管理
spring 的事务是怎么实现的
spring 事务的本质其实就是数据库对事务的支持,原理 drivermanager 获取连接, 开启事务,CRUD, 提交/回滚事务,关闭连接。
两种事务声明方式: 声明式和编程式(注解 @Transactional ,手写代码)
springmvc:
spring 为其展示层提供了一个优秀的web框架,基于MVC的设计理念,比其它的MVC框架更具有扩展性和灵活性;
设计模式:一共有23种设计模式
设计模式分为三类:创建型模式,结构性模式,行为型模式;
常见的几种设计模式:
1:工厂模式:Beanfactory
2: 单例模式: 默认情况下创建bean 的时候
3:代理模式: JDK 的动态代理,cglib 代理
4:模板模式; Beanfactory 和applicationtext
5;迭代器模式: iterable 接口定义了可被迭代的对象是如何迭代的;
string 类能否被继承
不能,因为string 类有final 修饰符,而final 修饰的类是不能被继承的。
类在什么情况下不能被继承:
1如果类被final 修饰,那个该类无法被继承;
2:如果类中只有private 的构造方法,那么此类不可以被继承;dc
原因: 1 一个类一定有构造函数,如果不写,那就是默认的无参构造函数,如果有,就只有所写的构造函数;
2 子类的构造函数一定会调用父类的构造函数,但是父类种只有私有的构造方法,那么子类就无法调用父类,那么就会有问题.
什么是springboot
springboot 是spring 开源组织下的子项目,是spring 组件一站式解决方案,主要是简化了使用spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能够快速上手.
为什么要使用springboot
1:独立运行。2:简化配置 。3:自动配置 ,4:无代码生成和xml 配置 5:应用监控 6 上手容易;
springboot 的核心配置文件有几个,区别是什么
springboot 的核心配置文件是application 和bootstrap 配置文件.
application 主要用于springboot 项目的自动化配置,bootstrap 配置文件主要有以下几个应用场景.
1.使用spring cloud config 配置中心时,这个时候需要在bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息.
springboot 的配置文件有几种格式,它们有什么区别
.properties .yml
主要是书写格式的不同,yml格式书写的配置有条理,更加适合阅读;
springboot 的核心注解是哪个
启动类上面的注解是@SpringBootApplication ,它是spring 的核心注解.
主要包含了3个注解:
@SpringBootConfiguration :实现配置文件的功能;
@EnableAutoConfiguration : 打开自动配置的功能;
@ComponentScan :组件扫描
开启springboot 特性有几种方式:
1继承spring-boot-starter-parent 项目
2 导入spring-boot-dependencies 项目依赖
springboot 需要独立的容器运行么:
可以不需要,springboot 内置了tomcat ,jetty 等容器.
运行springboot 有哪几种方式
1.打包用命令或者放在容器种运行;
2:用maven 插件运行
3;直接运行 main()方法;
如何理解springboot中的starters:
starters 可以理解为启动器,它可以包含一系列可以集成到应用里面的依赖包,可以一站式集成spring 以及其他技术,而不需要寻找各种依赖包。
如何在spring 启动的时候运行一些特定的代码
可以实现接口 ApplicationRunner和CommandLineRunner 这两个接口实现方式都一样,都只提供了一个run 方法.
springboot 实现热部署有哪几种方式:
spring loaded ,,,,spring-boot-devtools
springboot 配置加载顺序
1.properties 2 yml 文件 3.系统环境变量。 4 命令行参数.
什么是springcloud
spring cloud 流应用程序启动器是基于springboot 的spring 集成应用程序,提供与外部系统的集成.微服务提供将单一的应用程序化分为一组小的服务;
微服务之间如何独立通讯的:
1:同步 :RPC,REST
2:异步:消息队列
微服务技术栈:
服务开发:springmvc,springboot,spring
服务注册于发现: eureka,zookeeper
服务调用: feign,Rest,RPC
服务路由: zuul 网关: 路由和过滤器,是各种服务的统一路口.
负载均衡: nginx,ribbon:
消息队列: RabbitMQ
mybatis:
1.什么是mybatis:
mybatis 是一个优秀的基于java 持久层框架,它内部封装ljdbc,供开发者只要关注sql语句本身.
mybatis 通过xml 或者注解的方式,将各种要执行的statement 配置起来,并通过java 对象和statement 中的sql 的动态参数映射成最终执行的sql语句,最后由mybatis 框架执行sql ,并将结果映射成为java 对象返回.
2. mybatis的优点:
1消除JDBC大量冗余的代码,不需要手动开关连接。
2很好的与数据库兼容。
3提供了很多第三方插件(分页插件,逆向工程)
4与spring有很好的集成
5 相关灵活,sql 写在xml 文件中,从程序代码中分离,解除sql 与程序代码的耦合,便于统一管理与优化.
6 提供xml标签,支持编写动态sql 语句
7 提供映射标签,支持对象与数据库的orm 字段关系映射(9种动态sql 标签)
(if/where/choose/when/otherwise/bind/foreach/trim/set)
8 mybatis 将执行结果返回的方式
<resultMap>
<resultType>
9.在mapper 之间如何传递多个参数
@Param
10mybatis 有两级缓存
一级缓存是 sqlsession 级别的缓存,他作用域是一个sqlsession,在同一个sqlsession 中执行相同的sql语句,第一次执行完毕会将结果写入缓存中,第二次从缓存中获取.
二级缓存是mapper级别的缓存,作用域是mapper的同一个namespace,不同的sqlsession 在同一个 namespace 中执行相同的sql语句,第一次查询的结果写在缓存中,第二次从缓存中读取.
mybatis 默认开始一级缓存,没有开启二级缓存,二级缓存需要在xml配置中手动配置.
工作原理:
mybatis 通过配置文件创建 sqlsessionFactory ,sqlsessionFactory 通过配置文件,配置文件来源于两个方面,xml 和java中的注解,
获取sqlsession,sqlsession 包含了执行sql 语句的所有方法,可以通过sqlsession 直接运行映射的sql 语句,完成增删改查,用完之后关闭sqlsession;
redis 有哪些数据结构:
字符串: String 字典hash 列表list集合 set
有序集合: sortedset
什么是redis
redis 本质上是一个key-value 类型的内存数据库,整个数据库通通加载在内存之中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存;
因为是纯内存操作.redis 的性能非常出色,每秒可以处理超过10万次读写操作.是已经性能最快的key-value DB;
主要缺点是: 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写;
redis 主要消耗什么物理资源
内存
为什么redis 把数据放在内存中:
redis 为了达到最快的读写速度将数据都读取到内存中,并通过异步的方式将数据写入磁盘,所以redis 具有快速和数据持久化的特征,如果不把数据放入内存中,磁盘I/O速度严重影响redis 的性能;
redis 的使用场景
1会话缓存
2全页缓存
3 排行榜/计数器
4 发布/订阅
redis 集群的主从复制模型是怎么样的
为了使在部分节点失败或者大部分节点无法通行的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有(N-1)个复制品;
redis 集群之间是如何复制的:
异步复制。
使用redis 有什么好处
1速度快,因为数据存在内存中
2支持丰富的数据类型
3支持事务,操作都是原子性。
4丰富的特性: 可用于缓存,消息,按key 设置过期时间,过期之后会自动删除;
redis 常见性能问题和解决方案
1.master 最好不要做任何持久化工作,如RDB内存快照和 AOF日志文件;
2.数据比较重要,某个slaver开启AOF备份数据,策略设置为每秒同步一次
3.为了主从复制的速度以及稳定性,master 和slaver 最好在同一个局域网内;
4;尽量避免在压力很大的主库上增加从库;
5: 主从复制不要使用图状结构,用单向链表结构更为稳定。
什么是rabbitmq
采取AMOP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现服务之间的高度解耦;
为什么要使用rabbitmq
1.在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;
2,具有持久化的机制,进程消息,对列之间的信息也可以保存下来;
3 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定的限流,利于数据库的操作.
4 可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单.
3.使用rabbitmq 的场景
1.服务间异步通信
2.顺序消费
3.定时任务
4.请求削锋;
4 如何确保消息不丢失:
消息持久化(队列必须持久化)
rabbitmq 确保持久化信息能从服务器中重启的方式是:将她们写入磁盘上的一个持久化日志文件中,当发布一条持久化信息到持久交换机上,rabbitmq 会在消息提交到日志中才发送响应;
一旦消费方从持久化队列中消费了一条持久化信息,rabbitmq 在持久化日志中会把这条信息标记为等待垃圾收集,如果持久化信息在消费之前被rabbitMQ 重启,那么rabbitmq会自动重建交换机和队列,并重新发布持久化日志中的消息到合适的队列;
什么是elasticsearch
es 是一个高扩展,开源的全文检索和分析引擎,他可以实时的快速存储,搜索,分析海量的数据;
mogodb 和redis 应用场景的区别
mogodb 是一个跨平台的,面向文档的数据库,是当前nosql 数据库产品中最热门的一种,介于关系数据库和非关系数据库之间;
支持的数据结构非常松散:是类似json 的bson 格式,可以存储比较复杂的数据类型;
特点:
最大的特点是它支持的查询语言非常强大,几乎可以实现似关系数据库单表查询的绝大部分功能;
使用场景: 存储的数据量不是特别重要,数据量又十分大的时候;
什么是hashmap:
hashmap 是一个数组,是基于哈希表的map 接口的非同步实现,每一个元素是一个key-value 对,数据结构是一个链表散列;
hashmap 的key,value 均可为null,不允许有重复的链,hashmap是非线程安全的;
hashtable:
hashtable 几乎在每个方法上都加上同步锁,实现了线程安全;
hashset:
hashset 实现了set 接口,仅仅存储对象,使用add()方法将元素放入set 中;
arrayList:
arrayList是可变长度的数组列表,底层是基于动态数组.(随机访问快,线程不安全)
linkedList是基于链表的数据结构(新增和删除快)
vector 类似ArrayList 的可变长度的数组类型,vector 是线程安全的,适用于多线程程序中,vector占用内存空间大;
如何处理高并发:
1:页面静态化(效率最高,消耗最小)
2:图片服务器分离
3:缓存技术
4; 负载均衡
创建线程的方式
1:继承Thread 类
2:实现runnable 接口
RabbitMQ一共有5种消息模型:最常用的是 订阅模型(Topic)
高并发的时候是有很多用户在访问,导致出现系统数据不正确,丢失数据现象,所以想要的是一般用队列来进行解决;
通过锁机制:悲观锁 :数据处理过程中,数据处于锁定状态
乐观锁:基于数据库版本进行实现,为数据增添一个版本,读取数据的时候,将此版本号一同读出,之后更新的时候,对此版本号加1:
面向对象的三个基本特征:
封装
继承
多态
什么是线程安全:
线程同步: 当一个程序对一个线程的方法或语句进行访问的时候,其他的不能再对它进行操作,必须等到这次访问结束之后才能对这个线程的安全方法进行访问;
(互斥同步是最常见的一种并发正确性的保障手段)
面向对象的三大特征:
封装,继承,多态
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现隐藏信息的操作以及访问;
好处:只能通过规定的方法访问数据
隐藏类的实例细节,方便修改与实现.
封装的实现步骤:修改属性的可见性 private
创建getter/setter 方法
在setter/getter种加入属性控制语句
访问修饰符:
private 本类
默认 同包
protected 子类
public 全都可以使用
继承; 继承是类与类的一种关系,是一种 is a 关系
(java中的继承是单继承,一个类只有一个父类)
final 关键字
final 修饰类:表示该类不允许被继承
final 修饰方法 : 表示方法不允许被重写
final 修饰属性: 表示该类的属性,表示该类的属性不会进行隐式的初始化
final 修饰变量:表示变量的值只能进行一次赋值,即就是常量.
多态;对象的多种形态
父类可以引用本类对象
父类也可以引用子类对象
抽象类与接口的区别:
1:一个类只能继承一个抽象类,一个类可以实现多个接口
2;抽象类中的成员变量可以是各种类型的,接口的成员变量只能是 public static final 类型的
3.抽象类中可以有非抽象方法,接口中不能有非抽象方法;
4,接口中可以省略 abstract 关键字,而抽象类不行
5.接口中不能有静态代码块以及静态方法,而抽象类可以;
java 的循环方式有几种
1 for 循环
2 while 循环
3.迭代器循环
string 类常用的方法
1.获取字符串长度 str.length
2,获取字符串某一位置的字符: str.charAt()
3.获取字符串的子串 : str.substring(2,3)
4.字符串的比较: equals/
5.大小写转换
str.toLowerCase()
str.toUpperCase()
6.去空格
trim()
7.分割
split
8基本类型转换成字符串
str.value of()
list 和set
都实现了collection 接口
list:可以允许重复,有序容器,可以插入null
set: 无序容器,不允许重复,只允许一个null