Mybatis运行原理。如何编写一个插件
Mybatis的插件指的就是Mybatis的拦截器,Mybatis只支持针对ParameterHandler,ResultSetHandler,StatementHandler,Executor这个四个接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这四种接口对象的实现时,就会进入拦截方法,具体就是InvocationHandler的Invoke()方法,拦截那些你指定需要拦截的方法。
编写插件:实现Mybatis的Intercept()方法,然后给插件编写注解,指定拦截那一些的接口的那些方法即可,在配置文件中配置编写的插件。
Mybatis中 #{}与${}符号的区别:
- #{} 是预处理,是占位符,${}是字符串替换,是拼接符
- mybatis在处理#{}是将sql的参数使用 ? 来替换,调用PreparedStatment来赋值
- mybatis在处理 是将 {}是将 是将{}替换成变量的值,使用Statment来赋值。
- 使用#{}能够有效的防止SQL注入的问题,提高系统安全性
Spring面试篇
什么是Bean的自动装配,有哪些方式
- 根据类型自动装配 byType,如果有两个符合的类,则会报错。
- 根据名称自动装备 byName,需要set方法
- constructor 类似于byType,不过是应用于构造器的参数,如果一个Bean与构造器参数类型相同,则进行自动装配,否则导致异常
- autodetect如果有默认的构造器则使用constructor 自动装配,否则使用byType进行自动装配。
如何理解SpringBoot中的start
使用spring和spring mvc时,如果需要引入一个mybatis,需要到XML中定义mybatis的需要的bean,
start就是定义了一个start的jar包,写了一个@Configuration配置类,将这些Bean定义在里面,然后在start包的Meta-inf/spring-factories中写入该配置类,spring boot就会按照约定进行加载。
spring的事务什么时候会失效
spring事务的原理是AOP,进行了切面加强,那么失效的根本原因就是AOP不起作用了,常见的情况有如下几个
- 发生自调用,类里面使用了this调用本类的方法,此时这个this对象不是代理对象,而是类本身,解决办法,就是让类本身变成代理对象
- 方法不是public @Transactional,只能用于public之上,否则事务就i会失效,如果非要用在非public方法上,可以使用AspectJ代理模式
- 数据库不支持事务
- 没有被spring管理
- 异常被吃掉,事务不会回滚,或者抛出的一场没有被定义
spring事务的实现方式,隔离级别和原理
实现方式
- 编程式
- 声明式,@Transactional就是声明式
spring中的事务,是基于数据库事务和AOP机制实现的,如果一个方法开启了一个事务,那么在运行此方法的时候就会将commit设置为false,禁止自动提交,如果内嵌的方法也需要开启事务的话,就会重新创建一个新的数据库连接。
spring中使用的设计模式
- 工厂模式
- 适配器模式
- 访问者模式
- 装饰器模式
- 代理模式
- 观察者模式
- 策略模式
- 模板模式
- 委派模式
- 责任链模式
HashMap和Hashtable的区别
Hashtable是线程安全的,HashMap是线程不安全的。