面试-技术问题(二)
MyBatis怎么配置延迟加载
在mybatis的全局配置中进行配置
1 | <settings> |
lazyLoadingEnabled:
这个属性是开启全局延迟加载,不用手动在单个关联中配置。
aggressiveLazyLoading:
这个参数的含义是,当该参数设置为true时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,反之,每种属性都将按需加载。当我们从数据库中查询到数据后会给实体类中关联对象赋值,会调用关联对象属性的setter方法,这会触发上述规则,导致本该延迟加载的属性直接加载,为了避免这种情况,需要将其设置为false。
侵入式延迟加载和非侵入式延迟加载的区别
侵入式
执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情的一部分出现了。
非侵入式
执行完主加载对象的select语句,马上执行对关联对象的select查询。
延迟加载可以有效的减少数据库压力
什么场景使用立即加载
一对一,多对一:通常情况下我们使用立即加载.
什么场景使用延迟加载
一对多,多对多:通常情况下我们使用延迟加载,同时在关联对象的数据比较多并不经常使用时使用。
简述Maven的依赖传递
举个例子,比如A依赖B,B依赖C,那么A也是依赖C的。A是对B的直接依赖,A对C是传递依赖。
①、最短路径原则
如,路径一:A依赖B,B依赖C,C依赖D(1.0.0);
路径二:A依赖E,E依赖D(2.0.0),
此时A间接依赖D版本是2.0.0!
②、最先定义原则
如,路径一:A依赖B,B依赖C(1.0.0);
路径二:A依赖E,E依赖C(2.0.0),
此时A间接依赖C版本是1.0.0!
如果想精确的控制依赖包版本,可以使用依赖的排除功能 exclusions 标签来排除。
解决Maven依赖冲突的四种方式
最先定义原则
pom.xml文件按从上至下的顺序,哪个jar包的坐标在上面,这个jar包就是先声明的。最短路径原则
在依赖传递时,依赖冲突了,谁最近就用谁。
版本锁定原则
可以在xml文件中,先锁定版本,在引入依赖时,引用版本标签。
1
2
3
4
5
6
7
8
9
10
11
12
13
14<properties>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<!-- 锁定版本,spring4.2.4-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>排除原则
myBtais分页的四种方式
- 数组分页
- sql分页
- 拦截器分页
- RowBounds分页
Spring中BeanFactory、ApplicationContext两者装载bean的区别
BeanFactory:
提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化。
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
ApplicationContext在启动的时候就把所有的Bean全部实例化了。
接口和抽象类的区别
抽象类是类,它的子类不能再继承其它类了。
接口不是类,它的子接口可以继承、实现多个接口。
抽象类中是可以有非抽象的方法。
而接口中只能有抽象方法。
抽象类可以实现接口,而接口是不能继承或实现抽象类的。
抽象类多用于:将一些事物的相似之处,提取出来归为一个类。
接口多用于:定义一些规范的东西,使用时实现这个规范。