1、介绍下什么是Spring框架的IOC和DI
IOC 控制反转,指将对象的创建权,反转到Spring容器;
DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入,不能单独存在,需要在IOC的基础上完成操作,通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
2、Spring里面 bean的scope作用域有哪些
singleton:单例, 默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高,当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
prototype: 多例,调用getBean方法创建不同的对象,会频繁的创建和销毁对象造成很大的开销。
request :每个Http请求都会创建一个新的bean。
session: 每个Http Session请求都会创建一个新的bean。
3、什么是AOP以及好处
AOP 面向切面编程, 在不改变原有逻辑上增加额外的功能。
AOP思想把功能分两个部分:核心关注点(业务的主要功能)和横切关注点(非核心、额外增加的功能)。
比如以用户下单为例子:核心关注点是创建订单,横切关注点:记录日志、控制事务。
AOP 面向切面编程的好处:解耦;减少代码重复,可以统一处理横切逻辑。
4、解释下AOP里面常见的概念,比如 横切、通知、连接点、切入点、切面 、目标、织入
横切关注点:对哪些方法进行拦截,拦截后怎么处理,比如 权限认证、日志、事物;
通知:在特定的切入点上执行的增强处理,有5种通知(什么时间点、做什么事情);
连接点:要用通知的地方,全部方法都可以是连接点;
切入点:不能全部方法都是连接点,通过通配、正则表达式过滤出特定的一组 JointPoint连接点来进行通知;
切面:通常是一个类,里面定义 切入点(定义在什么地方)+通知(什么时间点、做什么事情);
目标:目标类,真正的业务逻辑,可以在目标类不知情的条件下,增加新的功能到目标类的链路上;
织入:把切面应用到目标函数的过程称为织入。
5、说下JDBC连接数据库的步骤
(1)加载数据库驱动
(2)获取数据连接对象
(3)获取语句对象,会话对象有两种Statement和PreparedStatement执行语句, PreparedStatement在执行之前会进行预编译,能够有效防止SQL注入;PreparedStatement支 持?占位符而不是直接拼接
(4)处理结果集
(5)关闭连接资源,关闭顺序:rs.close()、st.close()、conn.close()
6、说下Mybatis加载的流程
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心,SqlSessionFactory 的实例是通过 SqlSessionFactoryBuilder 从 XML 配置文件来构建出来的,SqlSessionFactory可以创建 SqlSession,SqlSession提供了执行 SQL 的方法,接着Executor负责执行SQL 语句。
7、#{ } 和 ${}的区别是什么
#{ }是预编译处理,${}是字符串替换;
mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
mybatis在处理${}时,会把${}替换成变量的值。
使用#{}可以有效的防止SQL注入。
8、介绍下Mybatis一级缓存跟Mybatis二级缓存
(1)、一级缓存的作用域是SqlSession,同一个SqlSession中执行相同的SQL查询(相同的SQL和参数),第一次会去查询数据库并写在缓存中,第二次会直接从缓存中取,默认开启一级缓存。
失效策略:当执行SQL时候两次查询中间发生了增删改的操作,即insert、update、delete等操作commit后会清空该SQLSession缓存; 比如sqlsession关闭,或者清空等。
(2)、二级缓存是namespace级别的,多个SqlSession去操作同一个namespace下的Mapper的sql语句,多个SqlSession可以共用二级缓存;默认是没有开启二级缓存,为了使用二级缓存,需要手动配置并在对应的 Mapper XML 文件中启用它。
操作流程:第一次调用某个namespace下的SQL去查询信息,查询到的信息会存放该mapper对应的二级缓存区域。第二次调用同个namespace下的mapper映射文件中,相同的sql去查询信息,会去对应的二级缓存内取结果。
失效策略:执行同个namespace下的mapepr映射文件中增删改sql,并执行了commit操作,会清空该二级缓存。
注意:
实现二级缓存的时候,MyBatis建议返回的POJO是可序列化的, 也就是建议实现Serializable接口。
若一级缓存和二级缓存同时启用,优先查询二级缓存->查询一级缓存->数据库。