什么是spring?
spring是一个轻量级的ioc哥aop容器的开源开发框架,简化企业级应用的开发,
常见的三种配置方式:
基于XML的配置,基于注解的配置,基于java的配置
spring的特点:
轻量,控制反转(IOC),面向切面的编程(AOP),容器,MVC框架,事务管理,异常处理
Spring主要由几个模块组成:
SpringCore:核心类库,提供IOC服务
SpringContext:提供框架式的bean访问方式
SpringAop:Aop服务
SpringDAO:对JDBC的抽象,简化了数据访问异常的处理
SpringORM:对现有的ORM框架的支持
SpringWeb:提供基本的面向Web的综合特性
SpringMVC:提供面向Web应用的Model-View-Controller实现
依赖注入的方式有几种?
1.构造器注入 2.setter注入 3.接口注入
SpringMVC的组件:
1.前端控制器DispatcherServlet
2.处理器映射器HandlerMapping
3.处理器适配器HandlerAdapter
4.处理器Handler
5.视图解析器View resolver
SpringMVC常用注解:
@requestMapping
@requestBody
@responseBody
谈谈对SpringAop的理解
面向切面编程,便于减少系统重复的代码,降低模块之间的耦合度,有利于未来的可拓展性和可维护性,
aop是基于动态代理,代理的对象实现了某个接口,使用JDK动态代理,没有实现接口使用CGlib代理
SpringAOP和AspectjAOP的区别
SpringAOP是属于运行时增强,而Aspectj是编译时增强,SpringAOP是基于代理而Aspectj基于字节码操作
AOP中连接点和切入点的区别
连接点代表一个应用程序的某个位置,这个位置可以插入一个aop切面是应用程序执行AOP的位置
切入点是一个或者一组连接点通知将在这些位置执行,可以通过表达式或者匹配的方式指明切入点
什么是通知,哪些类型
在方法执行前后要做的动作,是程序执行时要通过SpringAOP框架触发的代码段
before 前置通知
after 后置通知
after-returning 当方法成功执行完执行的通知
after-throwing 方法抛出异常退出时执行的通知
around 在方法执行前后的通知
什么是AOP
ioc就是控制反转,创建对象的主动权交给Spring容器管理,由容器去创建和管理各个实例之间的依赖关系,对象与对象之间的松耦合
DI(依赖)注入:应用程序在运行时候依赖ioc容器来动态注入对象需要的外部资源
IOC注入的三种方式:构造器注入,setter注入,注解注入
SpringBean的生命周期:
实例化bean,设置对象属性,处理aware接口,beanpostprocessor,initializingBean和ini-method,DisposableBean,destroy-method
Servlet的生命周期:实例化,初始化,接收请求,销毁
解释Spring支持的几种bean作用域
singleton,prototype,request,session,global-session
Spring基于xml注入bean的几种方式
set方法注入,构造器注入#通过index设置参数位置#通过type设置参数类型
Spring框架中用到哪些设计模式
工厂模式,单例模式,原型模式,迭代器模式,代理模式,适配器模式,观察者模式
事务的隔离级别
未提交读,提交读,可重复读,可串行化
事务的传播机制
PROPAGATION_REQUIRED 默认
PAOPAGATION_REQUIRE_NEW
PROPAGATION_NESTED
PROPAGATION_SUPPORTS
PROPAGATION_NOT_SUPPORTED
PROPAGATION_MANDATORY
PROPAGATION_NEVER
Spring事务实现方式
编程式事务管理,声明式事务管理
事务管理的优点
它为不同的事务API
数据源,事务管理器,事务应用和属性配置
事务注解的本质是什么 @transactional表明该方法要参与事务,配置相关属性来定制事务的参与方式和运行行为 Mybatis 什么h是mybatis 是一个半ORM对象关系映射框架,内部封装JDBC不需要去处理加载驱动创建连接创建statement mybatis的优点和缺点 优点:基于sql语句编程,相当灵活,解除sql与程序的耦合,便于统一管理, 支持编写动态sql语句并且可重用, 消除JDBC大量冗余的代码,很好的与各种数据库兼容 能够与Spring很好的集成 提供映射标签支持对象与数据库的ORM字段关系映射 缺点:sql语句编写工作量大,sql语句依赖数据库,不能随意更换数据库 #{}和¥{}的区别? #{}是预编译处理, ${} 是字符串替换。 Mybatis 在处理 #{} 时,会将 sql 中的 #{} 替换为 ? 号,调用 PreparedStatement 的 set 方法来赋值; Mybatis 在处理 ${} 时,就是把 ${} 替换成变量的值。 使用 #{} 可以有效的防止 SQL 注入,提高系统安全性 当实体类中的属性名和表中的字段名不一样怎么办? 查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
通过来映射字段名和实体类属性名的--对应关系 mybatis的缓存机制 在 Local Cache 进行查询,如果缓存命中 的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入 Local Cache ,最后 返回结果给用户 1.MyBatis 一级缓存的生命周期和 SqlSession 一致。 2. MyBatis 一级缓存内部设计简单,只是一个没有容量限定的 HashMap ,在缓存的功能性上有 所欠缺。 3. MyBatis 的一级缓存最大范围是 SqlSession 内部,有多个 SqlSession 或者分布式的环境下, 数据库写操作会引起脏数据,建议设定缓存级别为 Statement 。 JDBC的步骤有哪些? 1.装载相应的数据库JDBC驱动并进行初始化 2.简历JDBC和数据库之间的Connection连接 3.创建Statement或者PreparedStatement接口,执行sql语句 4.处理和显示结果 5.释放资源 Mybatis中如UserMapper.java是接口,为什么没有实现类还能调用? 使用JDK动态代理+MapperProxy,本质上调用的是MapperProxy的invoke方法 SpringBoot
SpringBoot的优点
1.独立运行
2.简化配置
3.自动配置
4.无代码生成和XML配置
5.应用监控
Springboot核心注解
@springbootapplication
@springbootconfiguration
@enableAutoConfiguration
@ComponentScan
运行springboot有几种方式
1.打包用命令或者放到容器中运行
2.用maven/Gradle插件运行
3.直接执行main方法运行
如何理解Springboot中的Starters?
可以理解为启动器,包含了许多项目中需要用到的依赖,快速运行
springboot配置加载顺序
properties文件,yaml文件,系统环境变量,命令行参数
Springboot核心配置文件?
application和bootstrap配置文件
数据库三范式是什么
第一范式:列不可再分
第二范式:行可以唯一区分,主键约束
第三范式:表的非主属性不能依赖与其他表的非主属性,外键约束
数据库的事务
什么是事务?
多条语句,要么成功要么失败
事务的特性:
原子性:只有所有操作都成功整个事务才会提交
一致性:事务操作成功后,数据库所处的状态和他的业务规则是一致的,数据不会被破坏
隔离性:不同的事务拥有各自的数据空间,所有操作不会互相干扰
持久性:一旦事务提交成功,事务中所有操作都必须持久化到数据库中
索引是什么?
帮助mysql高效获取数据的数据结构,加快数据库的查询包括聚集索引,覆盖索引,组合索引,前缀索引,唯一索引
SQL优化手段:
1.查询语句中不要使用select*
2.尽量减少子查询,使用关联查询代替
3.减少使用IN或者Not IN,使用exists,not exists或者关联查询语句替代
4.避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
5.or的查询尽量使用union或者union all代替
6.避免在where子句中对字段进行null判断
什么是视图?
一种虚拟的表,可以对视图进行增删改查,是有一个表或者多个表的行列的子集
什么是内连接,左外联接,右外联接
内联接(Inner Join):匹配2张表中相关联的记录。
左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记
录,右表中未匹配到的字段用NULL表示。
右外联接(Right Outer Join):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记
录,左表中未匹配到的字段用NULL表示。在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。
并发事务会带来哪些问题
脏读,丢失修改,不可重复读,幻读
大表如何优化?
1.限定数据的范围
2.读写分离
3.垂直分区
4.水平分区
分库分表之后id主键如何处理
UUID:不适合做主键,太长并且无序不可读,查询效率低
数据库自增id:需要独立部署数据库实例,成本高,有性能瓶颈
利用redis生成id:性能比较好,不依赖数据库,可用性降低,编码复杂,增加系统成本
Mysql中一条查询sql是如何执行的?
1.取得链接
2.查询缓存
3.分析器
4.优化器
5.执行器
索引有什么优点和缺点?
优点:题搞数据查询速度,降低数据库io成本
缺点:占用储存空间,降低更新表的速度
Mysql索引类型有哪些?
主键索引,普通索引,唯一索引,全文索引,空间索引,前缀索引
什么时候不要使用索引?
1.经常增删改的列不要建立索引
2.有大量重复的列
3.表记录太少
数据库的锁?
共享锁
排他锁
表锁
行锁
什么是悲观锁,
为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务 ,无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
什么是乐观锁?
通过 为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据
怎么避免死锁的出现?
1.设置获取锁的超时时间
2.设置按照统一顺序访问资源
3.避免事务中的用户交叉
4.保持事务简短并在一个批处理中
5.使用低隔离级别
6.使用绑定链接
主键与索引的区别?
主键一定会创建一个唯一索引,但是又唯一索引的列不一定是主键
主键不允许为空,唯一索引列允许空值
一个表只能有一个主键,但是可以又多个唯一索引
主键可以被其他表引用为外键,唯一索引不可以
主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构
Mysql如何做到高可方案
1.mysql高可用:分库分表,通过mycat连接多个mysql
2.mycat也得高可用:haproxy,连接多个mycat
3.haproxy也得高可用:通过keepalived辅助haproxy



